Добрый день!
Помогите, плз, решить следующую проблему.
Проблема: Access Violation.
Есть код на Дельфи:
procedure TForm1.Button1Click(Sender: TObject);
var
Connect: procedure(conn_str, conn_param: WideString; var ses_id: Integer);
session_id: Integer;
FRPCdll: THandle;
begin
session_id := 0;
FRPCdll := LoadLibrary('C:\Work\Projects\Delphi\test\connclient.dll');
if FRPCdll = 0 then
begin
exit;
end;
@Connect := GetProcAddress(FRPCdll,'Connect');
if (@Connect = nil) then
begin
exit;
end;
Label1.Caption := IntToStr(session_id);
Connect('d', 'd', session_id);
Label1.Caption := IntToStr(session_id);
FreeLibrary(FRPCdll);
FRPCdll := 0;
end;
Есть функции на С/С++ из DLL
void WINAPI Connect(char* conn_str, char* conn_param, int* session_id)
{
OutputDebugString("Run Connect\n");
*session_id = 10;
}
Спасибо,
bw
Здравствуйте, Аноним, Вы писали:
А> Connect: procedure(conn_str, conn_param: WideString; var ses_id: Integer);
А>void WINAPI Connect(char* conn_str, char* conn_param, int* session_id)
1. WideString и char * - что-бы это значило ?
2. cdecl
Здравствуйте, ZrenBy, Вы писали:
ZB>Здравствуйте, Аноним, Вы писали:
А>> Connect: procedure(conn_str, conn_param: WideString; var ses_id: Integer);
А>>void WINAPI Connect(char* conn_str, char* conn_param, int* session_id)
ZB>1. WideString и char * - что-бы это значило ?
ZB>2. cdecl
Упростил задачу. Функция C\C++
void __cdecl Connect(int* session_id)
{
OutputDebugString("Run Connect\n");
*session_id = 10;
return;
}
procedure TForm1.Button1Click(Sender: TObject);
var
Connect: procedure(var ses_id: Integer);
session_id: Integer;
FRPCdll: THandle;
begin
session_id := 0;
FRPCdll := LoadLibrary('C:\Work\Projects\Delphi\test\ctrcpclient.dll');
if FRPCdll = 0 then
begin
exit;
end;
@Connect := GetProcAddress(FRPCdll,'Connect');
if (@Connect = nil) then
begin
exit;
end;
Connect(session_id);
Label1.Caption := IntToStr(session_id);
FreeLibrary(FRPCdll);
FRPCdll := 0;
end;
Теперь не валиться, но и результат 0 для session_id и не печаться вывод от OutputDebugString, такое ощущение, что Connect вообще не выполняется
Спасибо,
bw
Здравствуйте, Softwarer, Вы писали:
S>Здравствуйте, Аноним, Вы писали:
S>В первую очередь — подпрограмма connect описана как WINAPI (что это — stdcall?) в то время как вызываете Вы ее согласно соглашениям о связи модели register. Опишите процедурный тип и укажите соответственно.
S>Во-вторых, я не совсем уверен, что WideString и char* не аукнутся Вам.
Спасибо, действительно помогло
bw.