Форум: "Основная";
Текущий архив: 2003.01.16;
Скачать: [xml.tar.bz2];
ВнизКак в DLL передать указатель на переменную, а потом вернуть его? Найти похожие ветки
← →
UserL (2003-01-06 08:18) [0]Вот сама функция в DLL
function Test(ConnectStr: String; Buffer: Pointer): Boolean; stdcall
Var
ConnectTo: TADOConnection;
Ret: String;
begin
CoInitialize(Nil);
Result := False;
ConnectTo := TADOConnection.Create(nil);
ConnectTo.ConnectionString := ConnectStr;
Try
ConnectTo.Connected := True
Finally
ConnectTo.Free;
End;
//ConnectTo для проверки
Ret := "gggggggggggg";
CopyMemory(Buffer, @Ret, SizeOf(Ret));
Result := True;
CoUninitialize;
end;
А вот вызов этой функции
procedure TForm1.Button1Click(Sender: TObject);
Var LibHandle: THandle;
ConStr: String;
s: String;
begin
s := Edit2.Text;
Edit2.Text := "";
ConStr := Edit1.Text;
CoInitialize(Nil);
@ShowAbout:=Nil;
LibHandle:=LoadLibrary(PChar(ExtractFilePath(Application.ExeName)+"ExportDll.dll"));
If LibHandle>=32 Then
Begin
@ShowAbout:=GetProcAddress(LibHandle, "Test");
If @ShowAbout<>Nil
Then If ShowAbout(ConStr, @s)
Then Panel1.Caption := "Yes"
Else Panel1.Caption := "No";
End;
Edit2.Text := s;
FreeLibrary(LibHandle);
end;
Ну вот на FreeLibrary(LibHandle) постоянно Exception вылетает.
Я так подозреваю что в DLL не правильно написал... А вот что именно не знаю...
Подскажите...
← →
Anatoly Podgoretsky (2003-01-06 09:46) [1]@s и @ret это не адрес строки(буфера) а адрес переменной.
SizeOf(Ret)) аналогичино размер этой переменной, всегда 4 байта
У тебя большие пробелы по работе со строками и указателями.
Такие вещи надо передавать или как PChar(s) или как @S[1]
Желательно и параметр объявить как PChar.
Так же и другни проблемы с несоблюдением границ, например выделено 3 байта под строку а пытаешься присвоить 12 байт.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.01.16;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.007 c