我用VC ++编译了一个包含类的Hunspell DLL ... 现在我想在Builder C ++ 2006中调用该DLL来使用它的函数......我怎么能这样做?
我尝试过:
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-space之后显示函数obj->但看起来它并没有真正识别类函数,并且它不断发出未解析的外部'__fastcall Hunspell :: add_dic(...);'引自....
将VC ++ dll调用到Builder C ++的确切方法是什么?在此先感谢大家...
干杯, Luigino
答案 0 :(得分:0)
首先,您必须#include
DLL 的导入头文件(包括类,consts定义...)
之后有两种方式:
静态DLL链接
很简单,但有时不适用于 MSVC ++ DLL 。您需要添加为 DLL 的 LIB 项目,您可以使用Borland bin文件夹中的 implib.exe 创建,但您可能必须使用命令行切换以纠正转换使用的修改,直到构建器可以解析所有外部。例如:
implib.exe -c -f -a glut32.lib glut32.dll
如果你有不正确的lib文件,那么编译器会添加你未解决的外部错误。此外,来自 MSVC ++ 的 obj / lib 文件与Borland / Intel不兼容,因为MS使用其非标准格式。在这种情况下,Borland会大喊错误的OMF ,因此 implib 实用程序
动态DLL链接
在示例中,我链接了 DLL 中的2个函数。对于链接类,您必须链接导入的所有类的所有已使用方法。你也可能在DLL中名称修改(类似于静态链接)有问题,所以使用一些工具来探索dll (我使用DLL导出查看器),它显示了真正的功能您必须在GetProcAddress
中使用的 DLL 中的名称。这是一个例子:
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 强>
在 MSVC ++ 和 Borland 之间构建 API 时,请注意导出/导入的内容,避免使用未在展位中使用的非标准数据类型平台(或与AnsiString
,...)相同的方式。