Visual c++ 如何引用C++;没有类/命名空间的库? 我有一个第三方C++,我想在C语言应用程序中使用。 我的意图是为.LIB编写一个托管C++包装器。DLL,然后在我的C语言应用程序中使用那个包装器DLL,使用一个大致类似.

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,

.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, 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的源代码吗?我无法访问那个来源。。。只有二进制库和头文件。