2

我正在尝试通过 CAPL 脚本引用第 3 方 dll 文件中的函数。因为,我不能直接调用它们,所以我正在尝试创建一个导出 dll 中的函数的包装器。

int MA_Init(char *TbName, int Option);是dll文件中的函数。

包装代码是

int CAPLEXPORT far CAPLPASCAL CMA_Init(char *TbName, int Option)
{
return MA_Init(*TbName, Option);
}

我正在尝试使用

HINSTANCE DllHandel = loadlibrary("C:\\Turbo.dll");加载库和

typedef int(*TESTFnptr)(char, int); TESTFnptr fn= (TESTFnptr)getprocaddress(DllHandle, "MA_Init");解析函数地址。

但是编译器说该函数"MA_Init()"未定义。我不确定我是否使用正确的程序将 dll 加载到我的可视 C++ 项目中。有没有人尝试过这样做或知道它是如何完成的?非常感谢你。

4

1 回答 1

0

标准程序是将相应的.lib文件包含到 VS 项目中。转到“项目-属性-配置属性-链接器-附加依赖项”并添加turbo.lib新行。然后你需要包含相应的turbo.h包含MA_Init函数定义的头文件。

在这种情况下,您可以MA_Init像现在一样直接拨打电话。编译器会很高兴地MA_Init在头文件中找到 的定义,而链接器会MA_Init.lib文件中找到对的引用。

如果您没有turbo.h文件,您可以自己创建一个,前提是您知道要使用的所有函数的原型。只要把定义像

int MA_Init(char *TbName, int Option);

在那里并包括它。

如果您没有turbo.lib文件,则必须继续使用LoadLibraryand GetProcAddress。显然,在这种情况下您不能MA_Init按名称调用,因为它是未定义的。您必须调用返回的指针GetProcAddress

TESTFnptr fn = (TESTFnptr)GetProcAddress(DllHandle, "MA_Init");
int CAPLEXPORT far CAPLPASCAL CMA_Init(char *TbName, int Option)
{
    return fn(TbName, Option);
}

PS。注意我删除了前面的开始TbName

聚苯乙烯。不要忘记包含您的包装函数 , CMA_Initto CAPL_DLL_INFO_LIST,否则 CANoe/CANalyzer 将无法访问它。

于 2016-02-09T17:42:27.047 回答