Страница 1 из 1
Передать параметры в функцию.
Добавлено: 22 окт 2009, 14:33
like-nix
Всем привет!
Не получается передать параметры из Delphi в библиотеку написанную на C++.
Код программы:
Код: Выделить всё
#define LIBINTERSECT_DECL extern "C" __declspec(dllexport)
LIBINTERSECT_DECL int __stdcall test_func_lib(int l, int b)
{
if(l == 1)
{
return 1;
}
return 2;
}
Код программы на Delphi:
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
LibHandle: THandle;
test_func_lib: function(l: Integer; b: Integer):Integer;
test_bool: Integer;
begin
LibHandle := LoadLibrary('test_dll.dll');
if LibHandle >= 32 then begin
@test_func_lib := GetProcAddress(LibHandle,'test_func_lib');
if @test_func_lib <> nil then
begin
test_bool := test_func_lib(1, 1);
showMessage (IntToStr(test_func_lib(1, 1)));
end;
end;
FreeLibrary(LibHandle);
showMessage (IntToStr(test_bool));
end;
Функция test_func_lib всегда возвращает 2.
Re: Передать параметры в функцию.
Добавлено: 22 окт 2009, 15:24
BBB
В Delphi написать:
test_func_lib: function(l: Integer; b: Integer):Integer;
stdcall;
Кстати, можно залинковать внешнюю библиотеку статически. В этом случае не надо будет делать LoadLibrary и GetProcAddr.
--------------------------------------------------------------------------------
Вот со статической линковкой:
Код: Выделить всё
test_func_lib: function(l: Integer; b: Integer):Integer;stdcall; external 'test_dll.dll' name 'test_func_lib';
procedure TForm1.Button1Click(Sender: TObject);
var
LibHandle: THandle;
test_bool: Integer;
begin
test_bool := test_func_lib(1, 1);
showMessage (IntToStr(test_bool));
end;
Кстати, как я понимаю, C-компилятор добавят к наванию функции символ подчеркивания (если в С-ном проекте в DEF-файле не переопределено внешнее имя экспортируемой функции).
Т.е. скорее всего, в Delphi внешнюю ф-ию надо будет описать как :
Код: Выделить всё
test_func_lib: function(l: Integer; b: Integer):Integer;stdcall; external 'test_dll.dll' name '_test_func_lib';
Re: Передать параметры в функцию.
Добавлено: 22 окт 2009, 16:35
like-nix
Убрал __stdcall
Код: Выделить всё
#define LIBINTERSECT_DECL extern "C" __declspec(dllexport)
LIBINTERSECT_DECL int test_func_lib(int l, int b)
{
if(l == 1)
{
return 1;
}
return 2;
}
и добавил cdecl
Код: Выделить всё
test_func_lib: function(l: Integer; b: Integer):Integer; cdecl
Спасло отца демократии)
Добавлено через 4 минуты
почемуто если
Код: Выделить всё
#define LIBINTERSECT_DECL extern "C" __declspec(dllexport)
LIBINTERSECT_DECL int __stdcall test_func_lib(int l, int b)
{
if(l == 1)
{
return 1;
}
return 2;
}
в Delphi
Код: Выделить всё
test_func_lib: function(l: Integer; b: Integer):Integer; stdcall;
Код: Выделить всё
@test_func_lib := GetProcAddress(LibHandle,'test_func_lib');
Функцию не находит
Если кто знает подскажите плиз.
Re: Передать параметры в функцию.
Добавлено: 22 окт 2009, 17:08
BBB
like-nix, я писал выше про символ подчеркивания в названии C-шной функции.
Re: Передать параметры в функцию.
Добавлено: 22 окт 2009, 17:51
like-nix
BBB писал(а):like-nix, я писал выше про символ подчеркивания в названии C-шной функции.
Да спасибо! Страницу не обновил)
Re: Передать параметры в функцию.
Добавлено: 23 окт 2009, 10:34
atavin-ta
" писал(а):Не получается передать параметры из Delphi в библиотеку написанную на C++.
Ну и кашу ты делаешь! Надеюсь, такой подход оправдан?
.
Добавлено: 23 окт 2009, 13:17
BBB
atavin-ta писал(а):Ну и кашу ты делаешь! Надеюсь, такой подход оправдан?
Не вижу в этом ничего криминального.
Нужно лишь соблюдать calling conventions и никаких проблем не будет.
Re: Передать параметры в функцию.
Добавлено: 23 окт 2009, 13:17
atavin-ta
Криминального и я не вижу. Просто первый раз вижу, чтобы их смешивали.
.
Добавлено: 23 окт 2009, 14:09
BBB
atavin-ta писал(а):Прсто первый раз вижу. чтобы их смешивали.
"Как же Вы еще молоды!" ((c) ПБК)