如何将dll加载到VS c ++中,它就像另一个CAPL代码的包装器一样?

时间:2016-02-01 02:53:25

标签: dll wrapper dllexport capl

我试图通过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 ++项目中。有没有人试过这样做或知道它是如何完成的?非常感谢你。

1 个答案:

答案 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个文件,则必须继续LoadLibraryGetProcAddress。显然,在这种情况下,您无法通过名称调用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中访问。