旧 c 代码到 ATL/COM dll

Posted

技术标签:

【中文标题】旧 c 代码到 ATL/COM dll【英文标题】:Old c code to ATL/COM dll 【发布时间】:2012-03-03 23:41:55 【问题描述】:

我有一个旧的 c dll,我想将其转换为 COM 服务器。

它只公开一个函数。

这就是我所做的: 我在 VS 2010 中创建了一个 ATL 项目,添加了一个带有包装函数的简单 ATL 对象。 我添加了 c 源代码和标题 在我调用 c 函数的包装函数中,我添加了完整的函数原型,如http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.5 中所述。

出现如下错误:

函数中引用的未解析的外部符号

我什么都试过了。

有什么想法吗?

【问题讨论】:

什么是完整的错误信息/未解析的符号? 错误 1 ​​错误 LNK2019:未解析的外部符号 _CreateGifFromEq 在函数“public: virtual long __stdcall CMimeTexWrapper::CreateGifFromEqWrapper(wchar_t *,wchar_t *)”中引用 (?CreateGifFromEqWrapper@CMimeTexWrapper@@UAGJPA_W0@Z) C :\Users\John\Documents\Visual Studio 2010\Projects\MimeTexCOM\MimeTexWrapper.obj MimeTexCOM 您忘记链接旧的 DLL 导入库。 它不是库,而是源代码。我想制作一个 COM dll 而不是 win32 dll。但是源代码是相同的,加上制作 COM dll 所需的任何内容。在我的例子中,因为我只需要一个函数,所以我创建了一个简单的 atl 对象并添加了一个包装函数。不过谢谢 【参考方案1】:

在包含 c-source 时需要使用 extern "C":

extern "C" 
    #include "header.h"

【讨论】:

是的。我这样做了: extern "C" int CreateGifFromEq ( char *expression, char *gifFileName );不过谢谢 您没有将旧的 .c 文件重命名为 .cpp?您确定原型与功能相同吗?同样的调用约定(__stdcall,__cdecl)? 如果我将文件重命名为 .cpp 会出现 202 错误。原型与函数相同。不知道调用约定,我该如何检查?谢谢! 好的。 (重命名为 .cpp 会导致您的链接更改并使 extern "C" 错误。)如果在实现端没有声明调用约定,它们都使用默认值。那么肯定是链接过程有问题。要检查 C 函数的导出名称,请将其声明为 __declspec(dllexport)。编译并查看dependency walker 中的dll。看看你在这个程序中看到的函数的名字。 你也可以使用dumpbin /exports your-dll【参考方案2】:

您可以尝试将 c dll 编译为常规的 win32 dll,然后通过包装器从您的 COM dll 中调用它。您将需要 2 个 dll,但如果原始 DLL 可以正常编译,您应该可以从 COM 使用它。

【讨论】:

谢谢,但这不是一个选择。我正在尝试构建一个 COM dll,因为它将简化使用此 c 代码的 C# 应用程序的部署。这个 c# 应用程序现在使用的是 win32 dll,如果可能,我们希望切换到 COM。

以上是关于旧 c 代码到 ATL/COM dll的主要内容,如果未能解决你的问题,请参考以下文章

Window 7 上的 ATL COM DLL 注册无法更新 CLSID 部分,但 TypeLib 可以工作

从 MFC 调用 ATL COM dll

Creating Context Menu / 创建上下文菜单项 / Win32, VC++, Windows, DLL, ATL, COM

[转]Replace all UUIDs in an ATL COM DLL.

在 ATL COM dll 中调用了错误的方法

ATL COM DLL 寄存器错误 0x80070716