我有一个用 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 的答案更改变量类型允许它正常运行。然而,它创造了一个新的、迄今为止完全无法解决的问题。我在这里创建了另一个问题,其中包含一些有关它的详细信息。
远程调用发生在 COM+ dll 中,在将类型返回integer
给另一个非 COM dll 的函数内。出于某种奇怪的原因,COM+ dll 的函数现在返回类型的变体VT_ERROR
而不是整数。我已经对此进行了彻底的测试,并确定我事先对返回值做什么、将其设置为任何值等都无关紧要,它总是返回一个错误。奇怪的是,错误的值显然是 0。我调用了CInt(returnValue)
、CStr(returnValue)
和CLng(returnValue)
,它们分别返回0
、Error 0
和0
。
我一直找不到任何信息来解释为什么应该返回整数的函数会突然返回错误。这给了我非 COM+ 函数中的类型不匹配错误,因为它试图将返回分配给本地整数。将其更改为变体允许我进行上述转换。呼叫VarType(returnValue)
给出 10,即vbError
。我们不想潜在地丢失 COM+ dll 中其他调用的失败信息,所以我不能忽略返回值。