导出在vb6中声明的c ++函数,导致“远程过程调用失败”运行时错误

时间:2013-05-07 21:48:52

标签: vb6 windows-server-2003 managed-c++

我有一个用C ++编写的dll,就像这样导出:

extern "C" {
    extern _declspec(dllexport) (VOID) Merge(LPCSTR szFileName, LPCSTR szMergeString, DWORD dwAlignment, BOOL fRepeat);
}

该功能在别处定义为:

extern _declspec(dllexport) (VOID) Merge(LPCSTR szFileName, LPCSTR szMergeString, DWORD dwAlignment, BOOL fRepeat)
{   
    Tools::Merge(gcnew String(szFileName), gcnew String(szMergeString), dwAlignment, fRepeat == TRUE);
}

在我的vb6 dll中,我已经声明了远程调用:

Private Declare Sub Merge Lib "Tools.dll" (fileName As String, mergeString As String, Alignment As Long, repeated As Boolean)

然后我在这样的代码中调用它:

Merge strPageFileName, "COPY", 5, True

当我运行应用程序时,我在消息框中收到“自动化错误:远程过程调用失败”。

Tools.dll位于C:\ Windows \ system32中。我测试了一个糟糕的dll名称,以确保这不是问题,并得到一个错误,说它找不到文件,所以我知道不是它。还有什么我需要做才能让它发挥作用吗?

编辑:根据下面的xxbbcc答案更改变量类型,可以使其正常运行。然而,它创造了一个新的,迄今完全无法解决的问题。我创建了另一个问题here,其中包含一些有关它的详细信息。

远程调用发生在COM + dll中,在函数内部返回类型integer到另一个非COM dll。出于某些奇怪的原因,COM + dll的函数现在返回类型VT_ERROR的变体而不是整数。我已经彻底测试了这一点,并确定事先对返回值做什么并没有关系,将它设置为任何值等等,它总是返回错误。奇怪的是,错误的值显然是0.我调用了CInt(returnValue)CStr(returnValue)CLng(returnValue),然后返回0Error 0 ,和0分别。

我一直无法找到任何解释为什么应该返回整数的函数会突然返回错误的信息。这在非COM +函数中给出了类型不匹配错误,因为它尝试将返回值分配给本地整数。将其更改为变体允许我进行上面的演员表。调用VarType(returnValue)得到10,即vbError。我们不希望丢失COM + dll中其他调用的失败信息,因此我不能忽略返回值。

3 个答案:

答案 0 :(得分:1)

BOOL应在VB6中定义为Long,并且为其传递的值应为01,而不是布尔值。它也应该是ByVal - 因为参数是通过C / C ++中的值传递的,所以你必须确保你的VB6程序遵循它。现在你的VB6程序传递指向Boolean的指针,而不是实际的Long。您的字符串也应定义为ByVal

article - 虽然过时了 - 但有一些有用的信息,说明为什么字符串应该从VB6传递为ByVal到C代码。

另一件事 - 我从未使用declspec(dllexport)成功将函数导出到VB6。我过去做了很多C / VB6编码,但它唯一有效的方法是通过DEF文件。我无法解释为什么(可能是因为我的无知)。如果修复BOOL参数解决了您的问题,请忽略我的答案的这一部分。 :)

答案 1 :(得分:0)

尝试在VB6 Declare语句ByVal中声明String参数。将“filename as String”更改为“ByVal filename as String”等等。

答案 2 :(得分:0)

我目前的解决方案是编写一个小的c ++控制台应用程序来调用导出的函数,并从vb6 dll中调用exe。