AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Funktionsaufruf aus C-dll mit Access Violation
Thema durchsuchen
Ansicht
Themen-Optionen

Funktionsaufruf aus C-dll mit Access Violation

Ein Thema von RPRI · begonnen am 10. Dez 2010 · letzter Beitrag vom 10. Dez 2010
Antwort Antwort
Seite 1 von 2  1 2      
RPRI

Registriert seit: 11. Feb 2003
Ort: A-6710 Nenzing
24 Beiträge
 
#1

Funktionsaufruf aus C-dll mit Access Violation

  Alt 10. Dez 2010, 11:12
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
Holm und Rippe,
bis zur Kippe !

Rainer

http://members.aon.at/p-51
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#2

AW: Funktionsaufruf aus C-dll mit Access Violation

  Alt 10. Dez 2010, 11:27
Stimmt die Aufrufkonvention stdcall? Ist TargetString ausreichend groß? Wie ist es so?
MyTarget := Target_Create ( @TargetString[1], TCP, g_Timeout );
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
RPRI

Registriert seit: 11. Feb 2003
Ort: A-6710 Nenzing
24 Beiträge
 
#3

AW: Funktionsaufruf aus C-dll mit Access Violation

  Alt 10. Dez 2010, 11:32
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
Holm und Rippe,
bis zur Kippe !

Rainer

http://members.aon.at/p-51
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#4

AW: Funktionsaufruf aus C-dll mit Access Violation

  Alt 10. Dez 2010, 11:33
Zeig uns doch am Besten mal die ganze aufrufende Routine (zumindest den relevanten Teil).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
RPRI

Registriert seit: 11. Feb 2003
Ort: A-6710 Nenzing
24 Beiträge
 
#5

AW: Funktionsaufruf aus C-dll mit Access Violation

  Alt 10. Dez 2010, 11:39
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
Holm und Rippe,
bis zur Kippe !

Rainer

http://members.aon.at/p-51

Geändert von RPRI (10. Dez 2010 um 15:06 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

AW: Funktionsaufruf aus C-dll mit Access Violation

  Alt 10. Dez 2010, 11:43
Deklariere TragetString als PChar oder rufe die Funktion mit @TargetString[1] auf.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#7

AW: Funktionsaufruf aus C-dll mit Access Violation

  Alt 10. Dez 2010, 11:52
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
RPRI

Registriert seit: 11. Feb 2003
Ort: A-6710 Nenzing
24 Beiträge
 
#8

AW: Funktionsaufruf aus C-dll mit Access Violation

  Alt 10. Dez 2010, 11:54
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
Holm und Rippe,
bis zur Kippe !

Rainer

http://members.aon.at/p-51

Geändert von RPRI (10. Dez 2010 um 12:29 Uhr)
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#9

AW: Funktionsaufruf aus C-dll mit Access Violation

  Alt 10. Dez 2010, 12:50
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';
  Mit Zitat antworten Zitat
RPRI

Registriert seit: 11. Feb 2003
Ort: A-6710 Nenzing
24 Beiträge
 
#10

AW: Funktionsaufruf aus C-dll mit Access Violation

  Alt 10. Dez 2010, 13:34
Delphi-Quellcode:
  User : STRING[255] = 'user'+#0;
  PWD : STRING[255] = 'password'+#0;
  ToolName : STRING[255] = 'M1ComTest+#0';
Hat leider auch nichts gebracht.
Holm und Rippe,
bis zur Kippe !

Rainer

http://members.aon.at/p-51
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 22:40 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