Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Funktionsaufruf aus C-dll mit Access Violation (https://www.delphipraxis.net/156668-funktionsaufruf-aus-c-dll-mit-access-violation.html)

RPRI 10. Dez 2010 10:12

Funktionsaufruf aus C-dll mit Access Violation
 
Hallo zusammen,

versuche gerade eine C-DLL in Delphi zu implementieren.
Habe eine Unit für das Funktionsprototyping angelegt.
Leider bekomme ich beim Aufruf der ersten Funktion schon eine AccesViolation.

Hier mal die Beispielcodes:
Funktion aus der C-Header Datei:
M1COM H_TARGET TARGET_Create(CHAR* address, PROTOCOL protocol, UINT32 timeout);

So sieht der Funktionsprototyp dazu aus:
FUNCTION TARGET_Create ( address : PChar; protocol : PROTOCOL; timeout : LONGWORD ) : H_TARGET; stdcall; external 'm1com.dll';

Und hier der Aufruf in meinem Programm:
MyTarget := Target_Create ( @TargetString, TCP, g_Timeout );

Der Fehler kommt aber nicht direkt beim Aufruf, sondern beim verlassen des OnClick ereignisses eines Buttons, mit dem ich den Aufruf starte.


Hat jemand von Euch eine Idee? Was habe ich falsch gemacht?

Danke schon jetzt für Eure Mühe.

Schöne Grüße
Rainer

DeddyH 10. Dez 2010 10:27

AW: Funktionsaufruf aus C-dll mit Access Violation
 
Stimmt die Aufrufkonvention stdcall? Ist TargetString ausreichend groß? Wie ist es so?
Delphi-Quellcode:
MyTarget := Target_Create ( @TargetString[1], TCP, g_Timeout );

RPRI 10. Dez 2010 10:32

AW: Funktionsaufruf aus C-dll mit Access Violation
 
Hallo Detlef,

geht so leider auch nicht.

Hier die Deklaration der Variablen.

VAR
g_Timeout : LONGWORD = 3000;
MyTarget : ^H_TARGET;
TargetString : STRING;

Danke für Eure Hilfe
Rainer

DeddyH 10. Dez 2010 10:33

AW: Funktionsaufruf aus C-dll mit Access Violation
 
Zeig uns doch am Besten mal die ganze aufrufende Routine (zumindest den relevanten Teil).

RPRI 10. Dez 2010 10:39

AW: Funktionsaufruf aus C-dll mit Access Violation
 
Hier der Aufruf:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
VAR
  TargetString : STRING[255];
begin
  // Target Create
  TargetString := PBEdit1.Text;
  MyTarget := Target_Create ( @TargetString, TCP, g_Timeout );
  IF ( MyTarget <> NIL ) THEN Label2.Caption := 'Target_Create : done'
    ELSE Label2.Caption := 'Target_Create : Error ';
  // Buttons
  Button1.Enabled := FALSE;
  Button2.Enabled := TRUE;
end;
Nach dem ich wie oben die Stringlänge ( STRING[255] ) angegeben habe, kommt keine AccessViolation mehr.
Dafür beim Aufruf der nächsten Funktion :-)

Danke und Gruß
Rainer

Luckie 10. Dez 2010 10:43

AW: Funktionsaufruf aus C-dll mit Access Violation
 
Deklariere TragetString als PChar oder rufe die Funktion mit @TargetString[1] auf.

DeddyH 10. Dez 2010 10:52

AW: Funktionsaufruf aus C-dll mit Access Violation
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
VAR
  TargetString : STRING;
begin
  SetLength(TargetString, 255);
  MyTarget := Target_Create ( @TargetString[1], TCP, g_Timeout );
  SetLength(TargetString, StrLen(PChar(TargetString)));
  ...
end;
So würde ich es versuchen.

RPRI 10. Dez 2010 10:54

AW: Funktionsaufruf aus C-dll mit Access Violation
 
Hallo,

habe nun beim aufruf dieser Funktion kein Problem mehr.
Dafür beim Aufruf der nächsten :-(

Delphi-Quellcode:
C-Funktion:
SINT32 TARGET_Connect(H_TARGET targetHandle, CHAR* user, CHAR* password, CHAR* toolName);

Delphi Prototyp:
FUNCTION TARGET_Connect ( targetHandle : H_TARGET; user, password, toolName : PChar ) : LONGINT; stdcall; external 'm1com.dll';

Aufruf:
procedure TForm1.Button2Click(Sender: TObject);
VAR
  RetCode     : LONGINT;
  User        : STRING[255] = 'user';
  PWD         : STRING[255] = 'password';
  ToolName    : STRING[255] = 'M1ComTest';
begin
  // Target Connect
  RetCode := TARGET_Connect ( MyTarget, @User[1], @PWD[1], @ToolName[1] );
  Label3.Caption := 'ReturnCode : ' + IntToStr ( RetCode );
end;
Hier kommt wieder eine Accessviolation nicht beim Aufruf der Funktion sondern nach dem Ende von Button2Click.

Danke für Eure Hilfe.

Schöne Grüße
Rainer

gammatester 10. Dez 2010 11:50

AW: Funktionsaufruf aus C-dll mit Access Violation
 
Da bei Shortstrings kein abschließendes #0 garantiert ist, versuch es einmal mit
Delphi-Quellcode:
  User        : STRING[255] = 'user'+#0;
  PWD         : STRING[255] = 'password'+#0;
  ToolName    : STRING[255] = 'M1ComTest+#0';

RPRI 10. Dez 2010 12:34

AW: Funktionsaufruf aus C-dll mit Access Violation
 
Delphi-Quellcode:
  User : STRING[255] = 'user'+#0;
  PWD : STRING[255] = 'password'+#0;
  ToolName : STRING[255] = 'M1ComTest+#0';
Hat leider auch nichts gebracht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:00 Uhr.
Seite 1 von 2  1 2      

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