2012-10-29 2 views
0

Я скомпилировал Hunspell DLL с VC++, который содержит класс ... Теперь я хочу назвать эту DLL в Builder C++ 2006, чтобы использовать ее функции ... как я могу это сделать?Builder C++, вызывающий класс VC++

Я попытался с:

typedef Hunspell * (CALLBACK *fpoint)(char *aff_file, char *dict_file); 
fp pHunspell = (fp)GetProcAddress(handle_Hunspell, "hunspell_initialize"); 
if (pHunspell) { 
    Hunspell* obj = (Hunspell *)pHunspell("..\hunspelldic\en_US.aff", "..\hunspelldic\en_US.dic"); 
    obj->add_dic("..\hunspelldic\it_IT.aff", "..\hunspelldic\it_IT.dic"); 
} 

дело, если в BuilderC++ 2006 Я могу показать функции после нажатия Shift-пробел после obj->, но похоже, что это на самом деле не признают функции класса и продолжает давать out Unresolved external '__fastcall Hunspell :: add_dic (...);' ссылка из ....

Каким будет точный способ вызова dll VC++ в Builder C++? Заранее спасибо всем, ...

Cheers, Luigino

ответ

0

сначала вы должны #include файл импорта заголовка для DLL (включая классы, consts определяет ...)

после этого 2 способа:

  1. статическая DLL ссылка

    легко, но иногда не работает с MSVC++ DLLs. Вам нужно добавить спроецировать LIB файла для DLL, которые вы можете создать с implib.exe в папке Borland бен но вы, вероятно, должны играть с командной строкой, чтобы исправить обращенный использовали не коверкая, пока строитель может разрешить все внешние ссылки. например:

    implib.exe -c -f -a glut32.lib glut32.dll 
    

    Если у вас есть неправильный файл lib, тогда компилятор добавит ваши нерешенные внешние ошибки. Также obj/lib файлы от MSVC++ несовместимы с Borland/Intel, потому что MS использует их нестандартный формат. В таком случае Борланд будет кричать что-то вроде неправильно ОМФ, следовательно Implib утилиты

  2. динамической библиотеки DLL ссылка

    в примере ниже я связываю 2 функции из DLL . Для связывания класса вы должны связать все используемые методы всех импортируемых вами классов. Также могут возникнуть проблемы с имя коверкая в DLL (похожие на статической ссылке) так использовать некоторый инструмент для изучения длл (я использую DLL Export Viewer), который показывает реальные имена функций в DLL которые вы должны использовать в GetProcAddress. Вот пример:

    HANDLE hdll; 
    typedef BOOL(__stdcall *_InitRemoteCtrl)(HWND); _InitRemoteCtrl InitRemoteCtrl; 
    typedef DWORD(__stdcall *_ReadRemoteData)(); _ReadRemoteData ReadRemoteData; 
    
    __fastcall TForm1::TForm1(TComponent* Owner):TForm(Owner) 
        { 
        hdll=LoadLibrary("./RemtCtrl.dll"); 
        if (hdll==0) Application->Terminate(); 
        InitRemoteCtrl=(_InitRemoteCtrl)GetProcAddress(hdll,"InitRemoteCtrl"); 
        ReadRemoteData=(_ReadRemoteData)GetProcAddress(hdll,"ReadRemoteData"); 
        } 
    
    void __fastcall TForm1::FormDestroy(TObject *Sender) 
        { 
        FreeLibrary(hdll); 
        } 
    

, если вы можете, потому что это более безопасно использовать первый вариант.Также не забудьте экспортировать/импортировать классы в файле DLL для файла DLL источник и импорт для DLL.

class __declspec(dllimport/dllexport) myClass 
    { 
    ... 
    }; 

PS

При построении API между MSVC++ и Борланд быть осторожными, что для экспорта/импорта избегать использования типов данных, не стандартные, не используемых в будки платформах (или в так же, как AnsiString, ...).

+0

Я забыл упомянуть, что функция winapi GetProcAddress имеет некоторые странные ошибки, которые в некоторых случаях делают некоторые функции в DLL непригодными. – Spektre

+0

Это странное поведение было протестировано на w2k sp4, wxp sp1,2,3 x32, w7sp1 x64. В некоторых случаях некоторые функции в DLL не могут быть недоступны (не могут найти нужную функцию, ни по имени, ни по порядку). Это происходит, главным образом, после редактирования PE (переименование функций в соответствии с устаревшим стилем стиля C). – Spektre

Смежные вопросы