【发布时间】:2011-09-20 22:05:35
【问题描述】:
注意:我对 C++ 一无所知。我很习惯使用 C#,但这让我很困惑。
我知道这是一个常见问题,但过去几个小时我一直很沮丧 - 主要是因为它应该非常简单。
我正在尝试将 DLL 导入 VC++ 2010,但我终其一生都想不出“好”的方法。我有包含定义的标头,以及我已使用“lib”转换为 .lib 文件的 .DEF 文件。
我想要做的就是能够调用包含在 DLL 中的函数!当我尝试将其添加为引用时,出现以下错误:无法添加对文件 WindowsAccessBridge.dll 的引用,因为它既不是 .NET 程序集也不是已注册的 ActiveX 控件。
我可以使用 LoadLibrary/GetProcAddress 访问这些函数,但我真的希望有一个“插入式”解决方案,这并不意味着我必须为 50 多个函数编写代码。
TL;DR:我如何将原生 C++ dll 导入我的项目,以便调用它的函数?我有 .lib、.def 和 .dll 文件。你的举动?
编辑 - 我意识到正确的答案是“学习你想要写的语言”。 - 但我真的希望有一种简单的方法来完成这项工作。
代码:
#include "StdAfx.h"
#include "WABAPI.h"
#include "AccessBridgeCalls.h"
WABAPI::WABAPI(void)
{
}
void WABAPI::Init()
{
initializeAccessBridge();
}
这是我在链接器中的设置:
【问题讨论】:
-
有一些证据表明您成功地跳过了障碍以获取 DLL #included 和链接。没有证据表明您实际上是在尝试调用它的任何导出函数。 wabapi.cpp 实际上是您的 EXE 项目的一部分吗?执行如何从 main() 流向 Init() 函数?
-
抱歉,我正在从 button_click 事件创建一个新的 WABAPI 实例,然后从那里调用 WABAPI.Init()。在此期间只是为了测试目的而这样做 - 这不是最终将如何使用它。此外,至于链接,它不起作用。使用上面列出的设置,我仍然收到错误:error LNK2028: unresolved token (0A000008) "extern "C" int __cdecl initializeAccessBridge(void)" (?initializeAccessBridge@@$$J0YAHXZ) 在函数“public: void __clrcall WABAPI”中引用::Init(void)" (?Init@WABAPI@@$$FQ$AAMXXZ)
-
所以你从 .def 组成了一个 .lib 文件。并且可能制作了一个 .h 文件。 .def 对函数名有什么看法?它是否以@@$$FQ$AAMXXZ 结尾?您可能没有正确声明它,extern "C" 很常见。联系 DLL 所有者以获取使用该 DLL 所需的文件。
-
我从一个 .def 文件创建了一个库,由 Oracle(DLL 所有者)提供给我。他们还提供了它的源代码,但我无法使用 /clr 标志编译它,所以我想我会像在 C# 中一样使用 DLL(使用 DLLImport)。因此,我发现自己现在的情况。我正在寻找的是一种仅使用其中包含的功能的方法。我不再关心“正确”或“简单”的方式了——只要一种可行的方式就好了。感谢您抽出宝贵的时间做出回应:-)
-
@HeWhoWas 您在上面发布的错误意味着您没有链接到任何定义该功能的东西。让我们看看 .def 和 .h
标签: visual-c++ dll linker