我正在尝试在我在 Visual Studio 2010 中用 C++ 编写的一个项目中使用数字示波器 Vellman PCSU1000。
为此,我需要使用设备制造商提供的两个 DLL:DSOLink.dll 和 PCSU1000D.dll。我没有任何其他相关文件。据我从手册中了解到,这些 DLL 是在 Deplhi 中编写和编译的。每个 DLL 中包含的函数以及如何在不同的编程语言中使用它们都有一个简短的描述。对于 C++ 语言制作者,选择了 Borland C++ Builder 并添加了以下代码(对于使用 DSOLink.dll,它与 PCSU1000D.dll 类似): DSOLink.h
//---------------------------------------------------------------------------
// DSOLink.h
#ifdef __cplusplus
extern "C" { /* Assume C declarations for C++ */
#endif
#define FUNCTION __declspec(dllimport)
FUNCTION bool __stdcall DataReady(); /*this particular line is added by me based on
list of the functions listed by dumpbin/exports DSOlink.dll and manual*/
FUNCTION __stdcall ReadCh1(int* ptr);
FUNCTION __stdcall ReadCh2(int* ptr);
#ifdef __cplusplus
}
#endif
//---------------------------------------------------------------------------
根据 MSDN 中的说明:http: //support.microsoft.com/kb/131313 我创建了一个 .lib 文件。由于构建解决方案成功完成,但调试返回错误消息“在 DSOLink.dll 中找不到函数 _DataReady@0 的入口点”。
从文章中:http : //bcbjournal.org/articles/vol4/0012/Using_Visual_C_DLLs_with_CBuilder.htm?PHPSESSID=ab5f6c83b3da921591a490a5accb5bf7 我知道在 C++ Builder 中,关键字 *__stdcall* 表示没有装饰对流,而在 VS 中则完全相反。
我知道在这种情况下,我不得不在 VS 中使用 *__stdcall* (它必须是在 DLL 和应用程序中使用的标头中管理堆栈清理的相同方法)和无装饰方法...我已阅读 .DEF 文件可能会有所帮助,但我不知道应该如何使用它。我试图以不同的方式创建 DEF:
EXPORTS
DataRead=DataRead
.
.
.
EXPORTS
DataRead=_DataRead@0
.
.
.
EXPORTS
_DataRead@0=DataRead
.
.
.
并立即将其中一个添加到我的项目中,但没有一个能解决问题。
有谁知道强制 VS 不使用并且不期望带有 *__stdcall* 的修饰名称的正确方法是什么?或者也许我的问题的原因是不同的,有人知道吗?
提前致谢。