Visual c++ 如何引用C++;没有类/命名空间的库? 我有一个第三方C++,我想在C语言应用程序中使用。 我的意图是为.LIB编写一个托管C++包装器。DLL,然后在我的C语言应用程序中使用那个包装器DLL,使用一个大致类似.
.lib的头文件不指示任何类声明或命名空间,只指示方法名称:Visual c++ 如何引用C++;没有类/命名空间的库? 我有一个第三方C++,我想在C语言应用程序中使用。 我的意图是为.LIB编写一个托管C++包装器。DLL,然后在我的C语言应用程序中使用那个包装器DLL,使用一个大致类似.,visual-c++,Visual C++,.lib的头文件不指示任何类声明或命名空间,只指示方法名称: int CheckNamedVariable(const char* _name); int RegisterNamedVariable(const char* _name); double GetNamedVariableValue(int _id); double GetNamedVariableTypedValue(int _id, int _units); void SetNamedVariableValue(int _id,
int CheckNamedVariable(const char* _name);
int RegisterNamedVariable(const char* _name);
double GetNamedVariableValue(int _id);
double GetNamedVariableTypedValue(int _id, int _units);
void SetNamedVariableValue(int _id, double _value);
... (etc)
我使用DUMPBIN/exports检查了lib,以查看是否可以收集任何其他信息,并得到以下信息:
File Type: LIBRARY
Exports
ordinal name
?AircraftVarGet@@YANHHH@Z (double __cdecl AircraftVarGet(int,int,int))
?CheckNamedVariable@@YAHPBD@Z (int __cdecl CheckNamedVariable(char const *))
?DLLStart@@YGXXZ (void __stdcall DLLStart(void))
?DLLStop@@YGXXZ (void __stdcall DLLStop(void))
?GetAircraftVarEnum@@YAHPBD@Z (int __cdecl GetAircraftVarEnum(char const *))
?GetModuleVar@@YANW4GAUGE_TOKEN@@@Z (double __cdecl GetModuleVar(enum GAUGE_TOKEN))
?GetNameOfNamedVariable@@YAPBDH@Z (char const * __cdecl GetNameOfNamedVariable(int))
?GetNamedVariableTypedValue@@YANHH@Z (double __cdecl GetNamedVariableTypedValue(int,int))
?GetNamedVariableValue@@YANH@Z (double __cdecl GetNamedVariableValue(int))
?GetUnitsEnum@@YAHPBD@Z (int __cdecl GetUnitsEnum(char const *))
?IsPanelWindowVisibleIdent@@YAHI@Z (int __cdecl IsPanelWindowVisibleIdent(unsigned int))
?Panels@@3PAUPANELS@@A (struct PANELS * Panels)
?RegisterNamedVariable@@YAHPBD@Z (int __cdecl RegisterNamedVariable(char const *))
?SendKeyEvent@@YAXII@Z (void __cdecl SendKeyEvent(unsigned int,unsigned int))
?SetNamedVariableTypedValue@@YAXHNH@Z (void __cdecl SetNamedVariableTypedValue(int,double,int))
?SetNamedVariableValue@@YAXHN@Z (void __cdecl SetNamedVariableValue(int,double))
_ImportTable
_Linkage
Summary
ED .debug$S
14 .idata$2
14 .idata$3
4 .idata$4
4 .idata$5
1A .idata$6
在我的托管包装器项目中,我可以将链接器输入指向.lib,但我不确定如何调用lib中的方法(我链接到的教程使用了名称空间和类)。如果它是C#/VB项目中一个普通的旧DLL,我可以查看对象浏览器并了解如何调用该库
但鉴于我的C++无知,我陷入了黑暗之中。谢谢你的帮助
编辑:
我尝试创建与标题中列出的方法同名的方法,例如:
int VariableExporter::IsPanelWindowVisibleIdent(unsigned int panel_id)
{
return IsPanelWindowVisibleIdent(panel_id);
}
这并不是我所希望的,它只是递归地调用自己(直到它有一个-等待它-堆栈溢出)
然后我尝试重命名包装器方法,如下所示:
int VariableExporter::IsPanelWindowVisibleIdent_New_Name(unsigned int panel_id)
{
return IsPanelWindowVisibleIdent(panel_id);
}
现在,虽然C++.DLL项目和C++项目都编译过,但是C项目在试图加载.DLL时抛出文件异常,
首先,调用全局级别函数,需要使用范围解析操作符<代码>::/>代码> < /P>int VariableExporter::IsPanelWindowVisibleIdent(unsigned int panel_id)
{
return ::IsPanelWindowVisibleIdent(panel_id);
}
没有必要(至少在这个简单的情况下)重命名您的方法
其次,对于未找到DLL的问题,请检查DLL是否存在于C#应用程序的
bin
路径中。此外,请检查包装器DLL本身是否可加载(使用Dependency Walker)。确保包装DLL和C#应用程序的位匹配。64位应用程序无法加载32位DLL(反之亦然)。对于导出到C的符号,请使用extern“C”
。。。。(或对C)请原谅我的无知,但是。。。这不属于.lib的源代码吗?我无法访问那个来源。。。只有二进制库和头文件。