【发布时间】:2014-01-25 22:44:44
【问题描述】:
这个问题将是不好提出的,但我一直在旋转我的轮子,我不知道如何更好地表达它。
我需要使用 C 语言编写一个 DLL,该 DLL 将从 VB6 中调用。我正在使用 Visual Studio Express 2013。我知道...VB6 是古老的,我认为代码的管理人员现在确信他们应该把它扔掉。但与此同时,这需要完成。
首先,我尝试使用一个函数编写一个 DLL,该函数只打印一条消息,并且在使用 VB.NET 调用 DLL 时工作正常。
这是我为 TinyDll.h 准备的内容。
#ifdef TINYDLL_EXPORTS
#define TINYDLL_API __declspec(dllexport)
#else
#define TINYDLL_API __declspec(dllimport)
#endif
extern TINYDLL_API void __stdcall testdll();
这里是 TinyDll.cpp
#include "stdafx.h"
#include "TinyDll.h"
#include <stdexcept>
using namespace std;
void __stdcall testdll()
{
printf("Got into the dll.\n");
}
顺便说一下,我在有和没有 __stdcall 的情况下都试过了。我还尝试使用 .def 文件来消除 dll 中的名称,但现在我不清楚这应该可以工作。我发现的例子表明这应该可以工作
LIBRARY TinyDll
Exports
testdll
但事实并非如此。 dll 中的名称仍然是乱码形式:?testdll@@YGXXZ。
我的测试代码相当简单,它与 VB.NET 完美配合,但不适用于 VB6。该问题与 VB6 进程无法找到 dll 和/或找到其中的函数有关。作为记录,这是用于测试的 VB6 代码
Declare Sub testdll Lib "TinyDll.dll" Alias "?testdll@@YGXXZ" ()
Sub Main()
testdll()
End Sub
首先,我是否正确没有必要调用 regsvr32 或 regasm? dll 不是 COM 对象——VB6 正在调用我的 C 代码,而不是相反。当我们尝试做这两件事中的任何一个时,要么是“找不到入口点 DllRegisterServer”,要么是“找不到指定的模块”。
最重要的是,VB6 开发环境太旧,无法在我的 Windows 7 机器上运行,而试图测试我的 DLL 的人处于另一种状态,并且严格来说是 VB 程序员。
我已经阅读了通过谷歌搜索可以找到的所有内容,因此我希望有人知道一个清楚地列出事实或展示工作示例的网站。
【问题讨论】:
-
这看起来像是 C++ 名称修改 - 你试过
extern "C"来抑制它吗? -
前面的问题是类似的(我很久以前读过),但除了原来的人自己想出来之外,没有明确的答案。我也关注了他提供的链接,但它是 2004 年编写的,我使用的是 Visual Studio 2013。该链接中的信息似乎不再解决问题。
-
目标 W7 机器是否有 VS2013 DLL? C 程序是用 /MD 还是 /MT 编译的?当您在 VB.net 上进行测试时,是在目标上还是在您的机器上?
-
您没有显示测试代码,但是 VB.NET 测试不会告诉您太多关于 VB6 的信息,因为它们之间存在差异。例如,在 Vb6 中使用 C DLL 调用时,您将使用 Long,在 NET 中,您使用 Integer。确保数据类型以及 ByVal/ByRef 正确