我试图通过CAPL脚本引用第三方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加载到我的Visual C ++项目中。有没有人试过这样做或知道它是如何完成的?非常感谢你。
答案 0 :(得分: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
个文件,则必须继续LoadLibrary
和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
前面的开头?
PPS。不要忘记将包装函数CMA_Init
包含在CAPL_DLL_INFO_LIST
中,否则将无法在CANoe / CANalyzer中访问。