2

我有一个用 C/C++ 编写的 Windows DLL(所有导出的函数都是“C”)。DLL 在 VC++ 中对我来说很好用。我已将 DLL 提供给另一家在 VB 中进行所有开发的公司。他们似乎在链接到这些功能时遇到了问题。我十年没用过VB了,我什至没有安装它。可能是什么问题呢?

我已将我的所有公共函数声明如下:

#define MYDCC_API __declspec(dllexport)


MYDCCL_API unsigned long MYDCC_GetVer( void);
.
.
.

有任何想法吗?


今天终于回到了这个并让它工作。答案让我走上了正确的道路,但我发现这最有帮助:

http://www.codeproject.com/KB/DLL/XDllPt2.aspx

此外,我在将字符串传递给 DLL 函数时遇到了一些问题,我发现这很有帮助:

http://www.flipcode.com/archives/Interfacing_Visual_Basic_And_C.shtml


4

3 回答 3

4

通过使用__declspecfor export,函数名称将被导出即包含类型信息以帮助 C++ 编译器解决重载问题。

VB6 无法处理错位名称。作为一种解决方法,您必须消除名称。最简单的解决方案是使用VC++ 中的导出定义文件链接 DLL 文件。导出定义文件非常简单,只包含 DLL 的名称和导出函数的列表:

LIBRARY mylibname
EXPORTS
    myfirstfunction
    secondfunction

此外,您必须指定stdcall调用约定,因为这是 VB6 可以处理的唯一调用约定。有一个项目使用程序集注入来处理 C 调用,但我想您不想使用这种困难且容易出错的方法。

于 2008-09-02T13:16:15.530 回答
3

尝试在末尾添加 __stdcall

#define MYDCC_API __declspec(dllexport) __stdcall

我们有一些与旧的 VB6 应用程序交互的 C++ dll,它们最后都有。

于 2008-09-02T13:16:30.257 回答
0

VB6 DLL 始终是 COM dll。我将用尽可能少的文字描述一个例子。假设您在 VB6 中有一个 ActiveX DLL 项目,其中包含一个名为 CTest 的类,其中包含如下所示的方法

公共函数 vbConcat(ByVal a As String, ByVal b As String) As String vbConcat = a & b End Function

并且您已在 VB6 项目属性中将项目名称设置为 VBTestLib,并且您已将项目编译为 F:\proj\VB6\ActiveXDLL\VBTestDLL.dll

您需要使用 Windows 命令 regsvr32 F:\proj\VB6\ActiveXDLL\VBTestDLL.dll 注册 dll

现在你的 C++ 代码:

#import "F:\proj\VB6\ActiveXDLL\VBTestDLL.dll" 使用命名空间 VBTestLib;

无效 CDialogTestDlg::OnButton1() {

 HRESULT hresult;
 CLSID clsid;
 _CTest *t; // a pointer to the CTest object
 _bstr_t bstrA = L"hello";
 _bstr_t bstrB = L" world"; 
 _bstr_t bstrR;
 ::CoInitialize(NULL);
  hresult=CLSIDFromProgID(OLESTR("VBTestLib.CTest"), &clsid);
  hresult= CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,
                               __uuidof(_CTest),(LPVOID*) &t);
  if(hresult == S_OK)
  {
     bstrR  = t->vbConcat(bstrA , bstrB);
     AfxMessageBox((char*)bstrR);
   }

}

这就是它的全部内容,开始吧。

于 2010-04-30T06:11:19.330 回答