Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передать параметры в функцию. Передать параметры в функцию. 
:(
    Опции темы
likenix
Дата 22.10.2009, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 13.10.2008

Репутация: нет
Всего: нет



Всем привет!

Не получается передать параметры из 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.

PM MAIL   Вверх
xvr
Дата 22.10.2009, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Почему то мне кажется, что у Delphi по умолчанию тип вызова __fastcall, и он распространяется и на вызываемую из dll функцию. А у нее прописан __stdcall

PM MAIL   Вверх
likenix
Дата 22.10.2009, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 13.10.2008

Репутация: нет
Всего: нет



>Почему то мне кажется, что у Delphi по умолчанию тип вызова __fastcall, и он распространяется и на вызываемую из dll функцию. А у нее прописан __stdcall
Сейчас подумаю

Убрал __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

Спасло отца демократии)

[size="1"][color="grey"]Добавлено через 4 минуты[/color][/size]
почемуто если 

Код
#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');

Функцию не находит

Если кто знает подскажите плиз.

Добавлено через 12 минут и 2 секунды
>Почему то мне кажется, что у Delphi по умолчанию тип вызова __fastcall, и он распространяется и на вызываемую из dll функцию. А у нее прописан __stdcall

Да ты прав, но

Код

#define LIBINTERSECT_DECL extern "C" __declspec(dllexport) 

LIBINTERSECT_DECL int  __fastcall test_func_lib(int l, int b)
{
    if(l == 1)
    {
        return 1;
    }
    
    return 2;
}


почемутто
Код

@test_func_lib := GetProcAddress(LibHandle,'test_func_lib');


функцию не находит(

Может плохо искал или не там)
PM MAIL   Вверх
xvr
Дата 22.10.2009, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Декорирование имен. Из нее получается нечто вроде test_func_lib@8 (может еще с подчеркиванием в начале)

PM MAIL   Вверх
likenix
Дата 22.10.2009, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 13.10.2008

Репутация: нет
Всего: нет



xvr, и как правильно вызывать такую функцию? Как угадать название?)
PM MAIL   Вверх
xvr
Дата 22.10.2009, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(likenix @ 22.10.2009,  16:02)
xvr, и как правильно вызывать такую функцию? Как угадать название?)

Посмотреть что получилось прямо в DLL, или задать ей принудительно нормальное имя при сборке DLL через DEF файл


Это сообщение отредактировал(а) xvr - 22.10.2009, 18:27
PM MAIL   Вверх
just_geek
Дата 23.10.2009, 05:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 309
Регистрация: 13.12.2007

Репутация: 2
Всего: 10



xvr, не будет декорирования имен при extern "C"

Давным-давно, для программы на делфи писал плагин.

У меня было так...
Код

extern "C" { __declspec (dllexport) char* ShowDescript(); }
extern "C" { __declspec (dllexport) void FormShow(); }


По умолчанию, соглашение вызова - __cdecl и все отлично работало...
PM MAIL   Вверх
xvr
Дата 23.10.2009, 06:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(just_geek @ 23.10.2009,  05:14)
xvr, не будет декорирования имен при extern "C"

Давным-давно, для программы на делфи писал плагин.

У меня было так...
Код

extern "C" { __declspec (dllexport) char* ShowDescript(); }
extern "C" { __declspec (dllexport) void FormShow(); }


Имеется в виду не С++ декорирование, а Win32 декорирование. Оно будет.
From MSDN about __stdcall:
Цитата

Name-decoration convention

An underscore (_) is prefixed to the name. The name is followed by the at sign (@) followed by the number of bytes (in decimal) in the argument list. Therefore, the function declared as int func( int a, double b ) is decorated as follows: _func@12


Цитата

По умолчанию, соглашение вызова - __cdecl и все отлично работало...
Для __cdecl декорирования нет:

Цитата

Name-decoration convention

Underscore character (_) is prefixed to names, except when exporting __cdecl functions that use C linkage

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0759 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.