AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein C-Funktions-Aufruf SetText(char* szLine); nach Delphi
Thema durchsuchen
Ansicht
Themen-Optionen

C-Funktions-Aufruf SetText(char* szLine); nach Delphi

Ein Thema von TERWI · begonnen am 31. Mär 2008 · letzter Beitrag vom 2. Apr 2008
Antwort Antwort
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
381 Beiträge
 
Delphi 11 Alexandria
 
#1

C-Funktions-Aufruf SetText(char* szLine); nach Delphi

  Alt 31. Mär 2008, 17:55
Moin zusammen !

Ich habe hier ein Display mit FB (IMON) von Soundgraph und dazu gibt's ne kleine API/DLL, mit der ich u.a. 2 Zeilen freien Text auf das Display zaubern kann. Alles in C - logo... Einbinden der DLL funzt soweit, aber irgendwie bekomme ich nix gescheites auf das Display.

Die Deklaration im C-Header-File lautet exakt:
IMONVFD_API bool iMONVFD_SetText(char* szFirstLine, char* szSecondLine); Ich habe daraus gemacht:
function VFD_SetText(TXT1, TXT2 : PChar) : bool; external 'SG_VFD.dllname 'iMONVFD_SetText'; Das frisst die DLL auch so ohne Gemaule und gibt TRUE als Ergebnis zurück. Aber im Display kommt nur Murks an.
Habe diverses versucht, aus 2 Edit's irgendwie den Text als PChar zu übergeben - aber nix.
Ich weiss, ich habe so was schon mal gemacht, aber wann und wo...
Kann mal jemand nem C-Allergiker auf die Sprünge helfen ? Dank im vorraus !
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: C-Funktions-Aufruf SetText(char* szLine); nach Delphi

  Alt 31. Mär 2008, 18:07
Zitat von TERWI:
Aber im Display kommt nur Murks an.
<Glasskugel>
Vielleicht ist das Display im Grafik Mode, während du es mit Textmode Funktionen ansprichst ? </Glasskugel>
Ansonsten: du solltest zuerst ein Demo Programm (zur Not den C Code compilieren und linken) nehmen und prüfen, ob das Display prinzipiell in Ordnung ist.
Dann kommts auch auf die Aufrufkonvention an (entweder stdcall oder cdecl):
Delphi-Quellcode:
const SG_VFD_DLL = 'SG_VFD.dll'; // gleich vorsorgen und den Namen der DLL als Konstante verwenden
function VFD_SetText(TXT1, TXT2 : PChar) : bool; stdcall; external SG_VFD_DLL name 'iMONVFD_SetText';
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
381 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: C-Funktions-Aufruf SetText(char* szLine); nach Delphi

  Alt 31. Mär 2008, 18:38
Vielleicht war das etwas unklar...

Es kommt ja schon was auf dem Display an, allerdings nur Hyroglyphen, so als wenn man irgendwo im Speicher was rausgreift, was kein Text ist.
Das mit dem DLL-Namen als CONST habe ich auch schon so im Text, nur einfach weggelassen - der übersichtlichkeit halber ?!
Die Aufrufkonvention STDCALL und andere habe ich auch schon probiert >>> Das gibt nur AccessViolations ohne Ende.

Die Funktion als solche scheint ja auch irgendwie zu funken: Dargestellter Text von IMON verschwindet und die Funktion als solche liefert TRUE zurück. Dazu muss ich in IMON erst einmal einstellen, das 'Dritte' das Display verwenden (muss man z.B. für Girder so machen). Mache ich das nicht, kommt false zurück.
Also scheint eine grundsätzlich in der Art Kommunikation zu klappen.

Meine Frage war nur:

Wie konvertiere ich die Strings aus den beiden Edit1.Text und Edit2.Text in PChar für die TXT1- und TXT2-Parameter der Funktion. Ich denke hier hapert es.

Oder habe ich die Konvertierung ...(char* szFirstLine, char* szSecondLine) des Funktionaufrufes grundsätzlich falsch gemacht ?

EDIT:
Ich habe keinen C-Komplier zum 'mal eben schnell...' So was kommt mir nicht auf die Maschine. Ich hasse C !
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: C-Funktions-Aufruf SetText(char* szLine); nach Delphi

  Alt 31. Mär 2008, 19:32
es ist die Aufrufkonvention! Da du keine spezielle angibst wird "register" verwendet und diese gibt es in C nunmal nicht also ist sie auf jeden fall falsch. Bei Register werden die Parameter wie der Name schon sagt über register übergeben. Deine DLL interpretiert nun das andere was da auf dem Stack liegt als die Paramter aber diese liegen dank register ja gar nicht dort sondern im register. Folglich siehst du Müll. Durch wahl der richtigen Aufrufconvention (per default in c = cdecl) werden die Paramter auch auf den Stack gepackt und somit sind sie auch dort vorhanden wenn die DLL vom Stack liest.

Deine Declaration ist bis auf die fehlende Convetion richtig. Und der aufruf lautet so:
VFD_SetText(PChar(Editx.Text), PChar(Edity.Text));
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
381 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: C-Funktions-Aufruf SetText(char* szLine); nach Delphi

  Alt 31. Mär 2008, 20:22
Klingt sinnig ! Werde ich morgen mal anschauen. Meine Frau sitzt gerade am HTPC und ich vor meiner Ballerbude und gucke wie mein Club das 1. Tor reingehämmert hat...
Ich sag wieder 'bescheid'.
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
381 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: C-Funktions-Aufruf SetText(char* szLine); nach Delphi

  Alt 2. Apr 2008, 09:11
Bescheid...
Positiv-Meldung: Ich hab meinen Text auf dem Display
Das ABER:
Wie ich oben schon sagte, führt der Aufruf der INIT-Funktion mit stdcall zur einer Access-Violation an Adresse 00000000.
Das hatte mich bisher davon abgehalten, es auf dem HTPC zu testen. Habe ich aber nun doch einfach mal gemacht....
Mein Label1 gibt mir OK zurück und der Text kommt. Den kann ich auch so oft ändern wie ich lustig bin - keine weiteren Fehler.
Auch Programm beenden (UNINIT) gibt kein Gemaule.
Was ist nun wieder verkehrt ?
Hier mal der kurze Quelltext zu Ansicht:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button2: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormShow(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  SGVFDDLL = 'SG_VFD.dll';

// used Function from SG_VFD.dll
function VFD_Init(vfdType, dummy : integer) : bool; stdcall; external SGVFDDLL name 'iMONVFD_Init';
procedure VFD_Uninit(); stdcall; external SGVFDDLL name 'iMONVFD_Uninit';
function VFD_IsInited() : bool; stdcall; external SGVFDDLL name 'iMONVFD_IsInited';
function VFD_SetText(TXT1, TXT2 : PChar) : bool; stdcall; external SGVFDDLL name 'iMONVFD_SetText';
function VFD_SetEQ(EQdata : array of integer) : bool; stdcall; external SGVFDDLL name 'iMONVFD_SetEQ';

{
TDUMP -ee SG_VFD.DLL           
EXPORT ord:0001='iMONVFD_CheckDign'
EXPORT ord:0002='iMONVFD_Init'
EXPORT ord:0003='iMONVFD_IsInited'
EXPORT ord:0004='iMONVFD_SetAlarmOFF'
EXPORT ord:0005='iMONVFD_SetAlarmON'
EXPORT ord:0006='iMONVFD_SetAlarmON_Abs'
EXPORT ord:0007='iMONVFD_SetEQ'
EXPORT ord:0008='iMONVFD_SetText'
EXPORT ord:0009='iMONVFD_Uninit'
///////////////////////////////////////////////
//   Open VFD driver and initialize parameters.
//   Call this method, when application starts.
//   Return value informs driver is open or not
bfdType = 4 !
IMONVFD_API bool iMONVFD_Init(int vfdType, int resevered=0);

///////////////////////////////////////////////
//   Close VFD driver.
//   Call this method, when application destroyed.
IMONVFD_API void iMONVFD_Uninit(void);

///////////////////////////////////////////////
//   Check if VFD driver is opened.
IMONVFD_API bool iMONVFD_IsInited(void);

///////////////////////////////////////////////
//   Send text data to VFD. VFD supports only English character set.
IMONVFD_API bool iMONVFD_SetText(char* szFirstLine, char* szSecondLine);

///////////////////////////////////////////////
//   Send EQ data to VFD.
//   Total 16band, each band ranges from 0 to 100
//  make EQ data with integer array.
EQValue : array[0..15] of integer !
IMONVFD_API bool iMONVFD_SetEQ(int* arEQValue);
}



procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  VFD_Uninit;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  if VFD_Init(4, 0) then
    label1.Caption := 'Init OK'
  else
    label1.Caption := 'Init failed';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if VFD_SetText(PChar(Edit1.Text), PChar(Edit2.Text)) then
    label2.Caption := 'Text OK'
  else
    label2.Caption := 'Text failed';
end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
381 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: C-Funktions-Aufruf SetText(char* szLine); nach Delphi

  Alt 2. Apr 2008, 11:19
... hat sich nun eigentlich von selbst erledigt.
Wenn man statt stdcall mal cdecl nimmt, klappts auch ohne Gemaule.
Ich hab's auch mit der 16-Band-EQ-Anzeige probiert - geht auch tadellos.
Meine kleine Demo (Source, EXE und DLL) zum testen / ansehen anbei.
Funzt logo nur wirklich, wenn man auch so ein Display von Soundgrapgh hat.

@SirThornberry
Deine Anzahl von Postings lässt auf adäquate Erfahrung schließen.
Würdest du bitte auch mal hier im Forum hineinschuen ? Ab S. 3 mitte.
Dank im voraus.

TERWI
Angehängte Dateien
Dateityp: zip imon_317.zip (210,4 KB, 13x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz