Страница 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
&quot писал(а):Не получается передать параметры из 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) ПБК)