Delphi & C/C++ DLL
От: Аноним  
Дата: 06.10.04 14:06
Оценка:
Добрый день!

Помогите, плз, решить следующую проблему.
Проблема: 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
Re: Delphi & C/C++ DLL
От: ZrenBy Россия  
Дата: 06.10.04 14:10
Оценка:
Здравствуйте, Аноним, Вы писали:

А> 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
Re: Delphi & C/C++ DLL
От: Softwarer http://softwarer.ru
Дата: 06.10.04 14:13
Оценка:
Здравствуйте, Аноним, Вы писали:

В первую очередь — подпрограмма connect описана как WINAPI (что это — stdcall?) в то время как вызываете Вы ее согласно соглашениям о связи модели register. Опишите процедурный тип и укажите соответственно.

Во-вторых, я не совсем уверен, что WideString и char* не аукнутся Вам.
Re[2]: Delphi & C/C++ DLL
От: Аноним  
Дата: 06.10.04 14:32
Оценка:
Здравствуйте, 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
Re[2]: Delphi & C/C++ DLL
От: Аноним  
Дата: 06.10.04 14:42
Оценка:
Здравствуйте, Softwarer, Вы писали:

S>Здравствуйте, Аноним, Вы писали:


S>В первую очередь — подпрограмма connect описана как WINAPI (что это — stdcall?) в то время как вызываете Вы ее согласно соглашениям о связи модели register. Опишите процедурный тип и укажите соответственно.


S>Во-вторых, я не совсем уверен, что WideString и char* не аукнутся Вам.

Спасибо, действительно помогло


bw.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.