我有一个问题困扰了整整一个星期,但我无法自己解决。我一直在谷歌搜索,并在各种论坛中搜索......我发现了很多“这可能有效”,尝试过,但没有,没有成功。如果有人有任何线索,请,请,帮助我!
我从外部来源获得了许多用 VB 编写的类和函数,我需要能够从 C++ 应用程序中使用这些类和函数。我的第一个想法是:没问题,我将 VB 代码转换为 dll,然后从我的 C++ 程序中加载它。这虽然比我想象的要难。我的 C++ 程序不是用 Visual Studio 编写的,但为了简单起见,我开始尝试从 Visual Studio C++ 应用程序加载我的 VB dll(用 Visual Studio 2010 编写)。到目前为止,这是我的代码:
VB代码:DllModule:类库项目
DLL模块.vb
Namespace DllModule
Public Module DllModule
Public Const DLL_PROCESS_DETACH = 0
Public Const DLL_PROCESS_ATTACH = 1
Public Const DLL_THREAD_ATTACH = 2
Public Const DLL_THREAD_DETACH = 3
Public Function DllMain(ByVal hInst As Long, ByVal fdwReason As Long,
ByVal lpvReserved As Long) As Boolean
Select Case fdwReason
Case DLL_PROCESS_DETACH
' No per-process cleanup needed
Case DLL_PROCESS_ATTACH
DllMain = True
Case DLL_THREAD_ATTACH
' No per-thread initialization needed
Case DLL_THREAD_DETACH
' No per-thread cleanup needed
End Select
Return True
End Function
'Simple function
Public Function Add(ByVal first As Integer, ByVal sec As Integer) As Integer
Dim abc As Integer
abc = first + sec
Return abc
End Function
End Module
End Namespace
DllModule.def
NAME DllModule
LIBRARY DllModule
DESCRIPTION "My dll"
EXPORTS DllMain @1
Add @2
C++ 代码:TryVbDllLoad:控制台应用程序
TryVbDllLoad.cpp
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <strsafe.h>
extern "C" {
__declspec(dllimport) int __stdcall Add(int, int);
}
typedef int (__stdcall *ptf_test_func_1_type)(int, int);
int __cdecl _tmain(int argc, _TCHAR* argv[])
{
HINSTANCE hdll = NULL;
hdll = LoadLibrary("DllModule.dll"); // load the dll
if(hdll) {
ptf_test_func_1_type p_func1=(ptf_test_func_1_type)GetProcAddress(hdll,"Add");
if(p_func1) {
int ret_val = (*p_func1)(1, 2);
} else {
DWORD dw = GetLastError();
}
FreeLibrary(hdll); // free the dll
} else {
DWORD dw = GetLastError();
}
return 0;
}
我可以加载 dll,但 GetProcAddess 返回 NULL,错误代码为 127(找不到指定的过程)。
我试图从 VB 应用程序加载 dll。这有效(即使没有 .def 文件)。但我猜没有创建 C++ 应用程序可以使用的正确入口点(当我在 Dependency Walker 中打开 dll 时,我看不到入口点或函数)。我尝试在有和没有“注册 COM 互操作”的情况下编译 VB 代码。
1)我做错了什么?
2)如果没有任何好的方法可以正确解决这个问题,我能做什么而不是创建一个dll?有没有其他方法可以在我的 C++ 应用程序中使用 VB 类和函数?
亲切的问候
萨拉
谢谢你的回答马!
我的 dll 中一定有某种错误,因为当我尝试注册时使用 regsvr32 我得到:“模块 C:/tmp/DllModule.dll 已加载,但未找到 DllRegisterServer 的起始地址。检查C:/tmp/DllModule.dll 是有效的 DLL 或 OCX 文件,然后重试。”
另外,当我使用
#import "C\tmp\DllModule.dll"
我明白了
fatal error C1083: Cannot open type library file: 'c:\tmp\dllmodule.dll'
我查看了教程的链接,但有一个小问题:在所有项目类型中没有“ActiveX DLL”之类的东西可供选择。是的,我确实有 Visual Studio 2010 Professional(试用版,但仍然如此)。
——萨拉