Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > нулевой указатель на функцию


Автор: bent 5.5.2006, 15:36
Здравствуйте.
В программу (на Microsoft Visual C++) подключаю библиотеку, разработанную в Borland C++ Builder.
Библиотека подключается, но вот адреса на функции получить не удается (нужные мне функции ЭКСПОРТИРУЕМЫЕ, все названия, возвращаемый тип и список параметров СОВПАДАЮТ - это проверено!). Может, существует какое-то преобразование имен функций из Borland в Visual C (ну там подчеркивание добавляется или регистр меняется), которое я упустил?
  Кстати, экспериментировал, перед названием функции (да и после него) ставил одинарное, двойное подчеркивание, менял регистр - без результата.
  Вот отрывок кода:

 
Код

 typedef int (*InitFunc) (int, int);
 InitFunc pInit;    

 HINSTANCE ElxDll = LoadLibrary("ElxCore.dll");
 if ( ElxDll != NULL )
{                
      pInit = (InitFunc)GetProcAddress(ElxDll, "InitData");
      pInit (6,7);
}

Еще раз подчеркну, что библиотека загружается (ElxDll != NULL) и в коде библиотеки название функции InitData, функция принимает два параметра типа int и выдает результат типа int.
Вот такая проблема... smile  

Автор: LuckLess 5.5.2006, 15:57
bent
добавь к функций ( как в борланде так и в микросове) 
extern "C"

Добавлено @ 15:57 
это предотвратит искажение имен 

Автор: Fazil6 5.5.2006, 15:58
для того, чтобы 100% уверенным в названиях функций добавь в проект библиотеки def файл, где указываются имена под которыми функции должны быть доступны из библиотеки (правда никогда из билдера так не делал, а только из VC)
вот например
Цитата

LIBRARY  Linkerdll.dll
EXPORTS
    create_link_thread       @1
    Send_Message             @2
    stop_link_thread         @3
    delete_link_thread       @4
    get_stability            @5
    create_fifo              @6
    fifo_is_empty            @7
    fifo_items   @8
    get_message              @9
    set_adres                @10
    
    get_mes_obj              @12

в MSDN посмотри по поводу def файла.

Хотя на моей памяти я не сталкивался чтобы Билдер коверкал имена.
Покажи объявление функции в самой библиотеке. 

Автор: bsa 5.5.2006, 20:05
Где-то сталкивался с тем, что необходимо было указывать подчеркивание перед именем функции (или наоборот - оно мешало ее достать иб библиотеки).
Еще интересно, как ты экспортировал. Должно быть примерно так:
extern "C" SOMETYPE __stdcall __export Function(LIST_OF_ARGS); 

Автор: bent 6.5.2006, 14:09
1. Объявление функции в библиотеке:
Код

#define DECLSPEC __declspec(dllexport)
DECLSPEC int InitData(int N, int M)
{
   ....
}

2. Попробую заменить это на
    
Цитата

    extern "C" SOMETYPE __stdcall __export Function(LIST_OF_ARGS);  

  Спасибо! 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)