如何将 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
文件,则必须继续 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.
中访问
我正在尝试通过 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
文件,则必须继续 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.