【发布时间】:2021-06-26 06:26:05
【问题描述】:
我目前在尝试与 Verifone PoS 集成时遇到一些问题。
我们合作的银行为我们提供了一个 .dll 文件、一个 .h 文件和一个 .hpp 文件。
我通常是 Java 或 PHP 开发人员,所以在过去的几天里,我浏览了我在网上找到的关于 DLL 文件以及如何使用它们的所有内容,但到目前为止似乎没有一个有效。我遇到了很多错误,其中很多类似于“无效的 dll”。
我在网上发现,除了一个 dll 文件,应该还有一个 .lib 文件。我问过第三方,但显然
没有 .lib 文件。 .dll 文件包含集成所需的所有信息
从他们的图书馆文档中我发现了这个:
提供的二进制文件的形式是一个动态库。就其本质而言,动态库允许更轻松的更新和更正,不需要重新编译或重新链接客户端(调用)代码,只要过程原型(函数参数和返回类型)保持不变。
用于库实现的语言是 C++。
为了访问库二进制文件中实现的功能,提供了一个 C 风格的头文件接口。这包括可调用的函数原型以及结果结构的类型,需要通过这些类型解释返回的数据以对先前访问的功能(特定请求的事务)有意义。
是的,.h 文件仅包含数据类型,而 .hpp 文件包含一些如下所示的声明:
extern "C" __declspec(dllexport) bool doSomething(int param);
在他们的文档中还有一个示例,说明实现的外观(而且相当简单):
bool someVar = doSomething(1);
看起来这些函数可以这么简单地调用,但它们不能。如果我尝试这样做,我会收到“未定义函数”(或类似的)错误。
此时似乎唯一起作用的(也许)是使用 LoadLibrary 函数加载 DLL。但除了我尝试调用的任何函数,无论使用任何参数,它都会返回 false,我根本不使用 .hpp 文件似乎有点错误。
所以我们到了。我应该如何解决这个问题?有没有办法加载 DLL 并使用提供的 HPP 文件作为函数定义?如果没有,除了 LoadLibrary + GetProcAddress 组合之外还有其他方法吗?
谢谢!
【问题讨论】:
-
它是 .net DLL 吗?你可以使用#using。 docs.microsoft.com/en-us/cpp/preprocessor/…
-
您是否尝试在 32 位进程上使用 64 位 DLL,反之亦然。看看dependencywalker.com中的DLL内容@
-
头文件真的包含
__declspec(dllexport)的声明还是隐藏在某些宏后面?因为__declspec(dllexport)仅在您是库作者 时才有效。这些注释将确保导入库(在 msvc 中是一个 .lib 文件)包含您要导出的所有函数。如果您是 dll 的 用户,则应该是__declspec(dllimport),但您仍然需要一个 .lib 文件,否则您必须手动GetProcAddress,afaik。如果它是托管 dll,就像 cup 说的那样,你可以#using它,但是给定的头文件看起来像原生的。 -
@cup 我使用了依赖遍历器,它看起来像一个 32 位的(有许多其他依赖项,如 user32.dll、shell32.dll、kernel32.dll 等)。此外,该应用程序在解析时生成警告:错误:未找到至少一个必需的隐式或转发依赖项。警告:至少没有找到一个延迟加载依赖模块。警告:由于延迟加载依赖模块中缺少导出功能,至少有一个模块存在未解析的导入。
-
@Timo 头文件的开头是这样的:#ifndef PROTOCOL_V4_INTERFACE #define PROTOCOL_V4_INTERFACE 下一行与我描述的完全一样,使用 dllexport。我读到 dll 导出是为那些生成 dll 的人准备的,但我是这里的用户。我应该用 dllimport 改变那些吗?
标签: c++ visual-studio dll