Visual c++ 为什么赢了';我的外部库方法不能解决吗?

Visual c++ 为什么赢了';我的外部库方法不能解决吗?,visual-c++,dll,com,linker,atl,Visual C++,Dll,Com,Linker,Atl,我有一个C内置的DLL(example.DLL),其中包含以下函数: void WINAPI free_job() { lc_free_job(jobPtr); } 我已经建立了这个DLL,并把示例.LIB < /C> >加入我的VisualC++项目中。现在,我正试图用一个简单的COM对象从ATL项目中调用其上的free\u job()方法。以下是我的标题中引用库的一部分: #include "..\lib\example.h" 在我的实现中,我将其称为: STDMETHODIMP

我有一个C内置的DLL(
example.DLL
),其中包含以下函数:

void WINAPI free_job()
{
    lc_free_job(jobPtr);
}
我已经建立了这个DLL,并把<代码>示例.LIB < /C> >加入我的VisualC++项目中。现在,我正试图用一个简单的COM对象从ATL项目中调用其上的
free\u job()
方法。以下是我的标题中引用库的一部分:

#include "..\lib\example.h"
在我的实现中,我将其称为:

STDMETHODIMP CCerberusSession::Free(CHAR* licensePath, CerberusErrorDetails* error)
{
    free_job();
    return S_OK;
}
它不会编译。我得到以下错误:

错误LNK2019未解析的外部符号“void\uu stdcall” 在函数“public: 虚拟长数据调用CCerberusSession::Free(char*,struct CerberUserRor详细信息*) (?Create@CCerberusSession@@UAGJPADPAUCerberusErrorDetails@@@Z)

我做错了什么,如何排除故障或修复它?任何想法都将是有帮助的,我们将不胜感激

编辑:我尝试将include这样包装:

extern "C" {
#include "..\lib\example.h"
}
但是,如果我尝试像这样编译它,会出现以下错误:

1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.CppCommon.targets(1749,5): warning MSB3073: The command "regsvr32 /s "C:\Code\Cerberus\Debug\Cerberus.dll"" exited with code 3.
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.CppCommon.targets(1761,5): error MSB8011: Failed to register output. Please try enabling Per-user Redirection or register the component from a command prompt with elevated permissions.
错误MSB8011未能注册输出。请尝试按用户启用 使用从命令提示符重定向或注册组件 提升权限


我以管理员身份运行Visual Studio。这里还有什么不对劲吗?

第一个问题是我需要把
#include
语句包装起来(谢谢你指出这一点,汉斯):

第二个问题是由于
regsvr32.exe
引起的。它找不到应用程序正在导入的依赖DLL,因为该DLL与已编译的ATL项目不在同一输出目录中。例如,如果您在Visual Studio中选中
输出
选项卡,您将看到如下内容:

1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.CppCommon.targets(1749,5): warning MSB3073: The command "regsvr32 /s "C:\Code\Cerberus\Debug\Cerberus.dll"" exited with code 3.
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.CppCommon.targets(1761,5): error MSB8011: Failed to register output. Please try enabling Per-user Redirection or register the component from a command prompt with elevated permissions.

我只需要在输出目录中包含
example.dll
C:\Cerberus\Debug\

编译得很好,它没有链接。请注意链接器错误消息中的C++名称。C标识符不应该被损坏。你需要
extern“C”{}
围绕这个#include.@HansPassant谢谢Hans。如果包装include,现在会看到另一个错误:
error MSB8011注册输出失败。请尝试启用每用户重定向或从命令提示符以提升权限注册组件。
我已编辑了该问题。还有什么其他的问题吗?我不确定,但是,这是否与它是一个ATL项目以及它现在无法在系统上注册输出有关?它是否与无法解析包含的DLL有关?任何想法都会大有帮助。当然,完全不同的问题。不知道“提升权限”是什么意思?谷歌搜索得很好,不要束手无策。@HansPassant我假设提升的权限意味着它是否以管理员身份运行,并具有管理员权限,在本例中,我的Visual Studio实例就是以管理员权限运行的,所以它为注册输出而启动的任何进程也应该处于相同的权限范围内。这一定与注册我的COM对象有关…谢谢你的帮助。