Hallo,
habe Probleme beim Aufruf einer C++ Dll, der eine Callback Funktion übergeben wird. Im C++ Beispiel Programm läuft alles einwandfrei. Versuche ich nun die Dll aus Delphi heraus anzusprechen wird die Function sms_senden ausgeführt, kehrt jedoch nicht mehr zurück und die Callback Procedure wird niemals angesprungen. Der Aufruf der Function dllversion hingegen funktioniert. Kann mir jemand sagen, ob ich die Deklarationen falsch angebe oder wo ansonsten der Fehler liegt.
Danke im voraus...
<PRE>
*****************************************<BR>
Beispiel C++<BR>
*****************************************<BR>
#include <stdio.h>
#include <windows.h>
typedef void (CALLBACK* LPFNDLLstatus)(int,char*);
typedef char* (CALLBACK* LPFNDLLVersion)();
typedef int (CALLBACK* LPFNDLLsms_senden)(char*,char*,char*,char*,LPFNDLL status);
LPFNDLLVersion dllversion;
LPFNDLLsms_senden sms_senden;
void CALLBACK status(int i,char* str)
{
printf("%d %s\n",i,str);
return;
};
int main( int argc, char *argv[ ], char *envp[ ] )
{
HINSTANCE dllhandle;
printf("Senden\n");
dllhandle = LoadLibrary("SMS_DLL.DLL");
if (dllhandle != NULL)
{
dllversion = (LPFNDLLVersion)GetProcAddress(dllhandle,"dllversi on");
sms_senden=(LPFNDLLsms_senden)GetProcAddress(dllha ndle,"sms_senden");
if (!dllversion || !sms_senden)
{
FreeLibrary(dllhandle);
return 2;
}
else
{
printf("Version: %s\n",dllversion());
sms_senden("123456","001930100","012345678","Info" ,(LPFNDLLstatus)status);
FreeLibrary(dllhandle);
return 0;
}
}
else
return 1;
}
*****************************************<BR>
Beispiel Delphi 6<BR>
*****************************************<BR>
function sms_senden(MSN: LPSTR; Provider: LPSTR; ToAddress: LPSTR;
Text: LPSTR; Func: Pointer): integer; stdcall; external 'SMS_DLL.DLL';
function dllversion: LPSTR: stdcall; external 'SMS_DLL.DLL';
implementation
procedure Status(StNum: integer; StMsg: LPSTR); stdcall;
begin
...
end;
var
Version: string;
RetVal: integer;
begin
Version := dllversion;
RetVal := sms_senden('123456','001930100','012345678','Info' ,@Status);
...
end;
</PRE>
habe Probleme beim Aufruf einer C++ Dll, der eine Callback Funktion übergeben wird. Im C++ Beispiel Programm läuft alles einwandfrei. Versuche ich nun die Dll aus Delphi heraus anzusprechen wird die Function sms_senden ausgeführt, kehrt jedoch nicht mehr zurück und die Callback Procedure wird niemals angesprungen. Der Aufruf der Function dllversion hingegen funktioniert. Kann mir jemand sagen, ob ich die Deklarationen falsch angebe oder wo ansonsten der Fehler liegt.
Danke im voraus...
<PRE>
*****************************************<BR>
Beispiel C++<BR>
*****************************************<BR>
#include <stdio.h>
#include <windows.h>
typedef void (CALLBACK* LPFNDLLstatus)(int,char*);
typedef char* (CALLBACK* LPFNDLLVersion)();
typedef int (CALLBACK* LPFNDLLsms_senden)(char*,char*,char*,char*,LPFNDLL status);
LPFNDLLVersion dllversion;
LPFNDLLsms_senden sms_senden;
void CALLBACK status(int i,char* str)
{
printf("%d %s\n",i,str);
return;
};
int main( int argc, char *argv[ ], char *envp[ ] )
{
HINSTANCE dllhandle;
printf("Senden\n");
dllhandle = LoadLibrary("SMS_DLL.DLL");
if (dllhandle != NULL)
{
dllversion = (LPFNDLLVersion)GetProcAddress(dllhandle,"dllversi on");
sms_senden=(LPFNDLLsms_senden)GetProcAddress(dllha ndle,"sms_senden");
if (!dllversion || !sms_senden)
{
FreeLibrary(dllhandle);
return 2;
}
else
{
printf("Version: %s\n",dllversion());
sms_senden("123456","001930100","012345678","Info" ,(LPFNDLLstatus)status);
FreeLibrary(dllhandle);
return 0;
}
}
else
return 1;
}
*****************************************<BR>
Beispiel Delphi 6<BR>
*****************************************<BR>
function sms_senden(MSN: LPSTR; Provider: LPSTR; ToAddress: LPSTR;
Text: LPSTR; Func: Pointer): integer; stdcall; external 'SMS_DLL.DLL';
function dllversion: LPSTR: stdcall; external 'SMS_DLL.DLL';
implementation
procedure Status(StNum: integer; StMsg: LPSTR); stdcall;
begin
...
end;
var
Version: string;
RetVal: integer;
begin
Version := dllversion;
RetVal := sms_senden('123456','001930100','012345678','Info' ,@Status);
...
end;
</PRE>