Autor Beitrag
souso20
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Do 14.07.05 15:02 
Hallo Zusammen!

Ich bin verzweifelt! Ich versuche seit geraumer Zeit eine in Delphi konstruierte DLL in C++ zu benutzen. Die DLL ist einfach gehalten und soll lediglich einen String in einer MessageBox, welcher von C++ übergeben wird, anzeigen.
Die Delphi DLL wird dynamisch geladen.

Delphi Code:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
uses
  SysUtils,
  Classes,
  Dialogs;

{$R *.res}

procedure DialogWithParam(aParam: PChar);export;
var
  test : string;
begin
   MessageDlg('Called DialogWithParam! Param: ' +  aParam, mtInformation, [mbOK], 0);
end;


exports
  DialogWithParam,

begin
end.


C++ Code

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
  
  HMODULE lTestDLL;
  tShowWithParam withp;

  char *s = "Test";

  lTestDLL = LoadLibrary("C:\\TestDLL.dll");  

  withp = (tShowWithParam)GetProcAddress(lTestDLL, "DialogWithParam");
  (*withp)(s);

  FreeLibrary(lTestDLL);


Nun zu meiner Frage:

Wenn ich die Delphi procedure als export deklariere dann wird mir die MessageBox mit einem falscher String angezeigt.
Wenn ich die Delphi procedure als stdcall deklariere dann wird mir die
MessageBox mit dem richtigen String angezeigt aber mein C++ Programm schliesst sich einfach, oder es werden Zugriffsverletzungen generiert.

Ich hoffe ihr könnt mir helfen!
Danke im vorraus!

Benutzte Versionen:
Delphi 7
VC++ 6.0

Moderiert von user profile iconMotzi: Code- durch Delphi-Tags ersetzt.
retnyg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Do 14.07.05 15:26 
mach mal stdcall und export
die zugriffsverletzung kommt vielleicht weil dein c++ prog versucht die dll zu entladen, obwohl die messagebox noch da ist

_________________
es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
Sprint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Do 14.07.05 15:39 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
library MyLib;

uses
  Dialogs;

procedure MyProcedure(MyString: PChar); stdcall;
begin
  MessageDlg(MyString, mtInformation, [mbOK], 0);
end;

exports
  MyProcedure;

begin
end.


ausblenden Quelltext
1:
typedef void (__stdcall *TMYPROCEDURE)(LPCSTR);					

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
    HMODULE      hMyLib;
    TMYPROCEDURE MyProcedure;

    hMyLib = LoadLibrary("MyLib.dll");

    if (!hMyLib == NULL)
    {
        MyProcedure = (TMYPROCEDURE)GetProcAddress(hMyLib, "MyProcedure");  
        if (!MyProcedure == NULL)
            MyProcedure("Test");
        FreeLibrary(hMyLib);
    }

_________________
Ciao, Sprint.
souso20 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Do 14.07.05 15:41 
Danke für Deine Hilfe!

Ich habe es jetzt mal mit stdcall und export ausprobiert.

Zudem habe ich noch die MessageBox auskommentiert, also wird die Delphi procedure nur mit dem Parameter aufgerufen.

Das selbe in grün.

Wenn ich eine procedure ohne übergabeparamter benutze, dann klappt stdcall und export ohne Absturz.
ScorpionKing
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1150

Win XP

BeitragVerfasst: Do 14.07.05 15:48 
user profile iconsouso20 hat folgendes geschrieben:
Danke für Deine Hilfe!

Ich habe es jetzt mal mit stdcall und export ausprobiert.

Zudem habe ich noch die MessageBox auskommentiert, also wird die Delphi procedure nur mit dem Parameter aufgerufen.

Das selbe in grün.

Wenn ich eine procedure ohne übergabeparamter benutze, dann klappt stdcall und export ohne Absturz.


Das kann gar nicht sein, denn oben das klappt super! Irgendwas ist vielleicht am Restlichen Code falsch!

_________________
Aus dem Urlaub zurück!
Alstar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 827



BeitragVerfasst: Do 14.07.05 15:54 
user profile iconScorpionKing hat folgendes geschrieben:
user profile iconsouso20 hat folgendes geschrieben:
Danke für Deine Hilfe!

Ich habe es jetzt mal mit stdcall und export ausprobiert.

Zudem habe ich noch die MessageBox auskommentiert, also wird die Delphi procedure nur mit dem Parameter aufgerufen.

Das selbe in grün.

Wenn ich eine procedure ohne übergabeparamter benutze, dann klappt stdcall und export ohne Absturz.


Das kann gar nicht sein, denn oben das klappt super! Irgendwas ist vielleicht am Restlichen Code falsch!


Meinst du den Beitrag von user profile iconSprint? Ich glaub, den hat er noch garnet gesehen ...

Alstar
ScorpionKing
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1150

Win XP

BeitragVerfasst: Do 14.07.05 15:57 
user profile iconAlstar hat folgendes geschrieben:
Meinst du den Beitrag von user profile iconSprint? Ich glaub, den hat er noch garnet gesehen ...

Alstar


Dann ist klar, dass es nicht geht! :wink:

_________________
Aus dem Urlaub zurück!
souso20 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Do 14.07.05 16:04 
Hallo Zusammen!

Hatte den Beitrag noch nicht gesehen. Ihr seit einfach sehr schnell(im positiven Sinne).

Danke ScorpionKing, habe meinen Fehler gefunden.

ausblenden Quelltext
1:
typedef void (*tShowWithParam)(LPSTR aParam);					


Dann kann das natürlich nicht gehen. :wink:

Vielen Dank.

War kurz davor meine Haare auszureissen.

Super Forum(Daumen Hoch).

Bis denne
ScorpionKing
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1150

Win XP

BeitragVerfasst: Do 14.07.05 16:08 
user profile iconsouso20 hat folgendes geschrieben:
Danke ScorpionKing, habe meinen Fehler gefunden.


Dank nicht mir, sondern Sprint für den Code! :wink:

_________________
Aus dem Urlaub zurück!
souso20 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Do 14.07.05 16:16 
Hallo Sprint!

Sorry hab mich, in der Freude das es endlich klappt, leider verlesen.

Natürlich gilt Dir der Dank.

Bis denne