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

How to load a dll into VS c++, which acts like a wrapper to another CAPL code?

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

标准程序是将相应的 .lib 文件包含到 VS 项目中。转到 "Project - Properties - Configuration Properties - Linker - Additional Dependencies" 并在新行中添加 turbo.lib。然后你需要包含相应的 turbo.h 头文件,其中包含 MA_Init 函数的定义。

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

如果您没有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.

中访问