将字符串数组从 Delphi 7 传递到 COM Visible C# .net DLL



我有一个C# DLL(.NET 2.0框架(,它被设置为COM Visible。

接口声明为

[Guid("....")]
[InterfaceType(ComInterfaceType.InterfaceIDispatch)]
public interface IMyClass
{
[DispId(1)]
string myFunc(string url, ref string[] keys);
}
[Guid("...")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("MyClass.Lib")]
public class MyClass:IMyClass
{
public string myFunc(string url, ref string[] keys)
{
string retString = "";
// do my stuff
return retString;
}
}

此类通过调用RegAsm.exe注册。

我在 VB6 中测试了这个 DLL,它工作正常。

Dim myClassInstance As MyClass
Set myClassInstance As New MyClass
Dim keys(0 to 1) As String
keys(0) = "a"
keys(1) = "b"
Dim url As String
url = "https://10.0.0.2"
Dim response As String
response = myClassInstance.myFunc(url, keys)

现在我需要在 Delphi 7 中使用此 DLL(我对 Delphi 没有任何先验知识(。

我使用 Tlbimp 生成所需的文件。看起来我已经可以在德尔福中引用 DLL,但它不起作用:

var
myClassInstance : IMyClass;
url : WideString
keys : array[0..1] of WideString;
begin
url := 'https://10.0.0.2';
keys[0] := 'a';
keys[1] := 'b';
myClassInstance.MyFunc(url, keys); // Incompatible types error
end;

函数签名是(来自Delphi 7编辑器(:

function(const url: WideString; var keys: OleVariant): WideString;

我应该如何将正确的参数传递到德尔福中的这个 DLL 中?

在 COM 级别,DLL 希望您传入包含BSTR字符串SAFEARRAYVARIANT。 VB 和 C# 使用更高级别的语法向您隐藏该详细信息。

在德尔福中,WideStringBSTR的包装器,您可以使用 RTL 的VarArrayCreate()函数来创建 OLE/COM 兼容数组。

试试这个:

var
myClassInstance : IMyClass;
url : WideString;
keys : OleVariant;
begin
url := 'https://10.0.0.2';
keys := VarArrayCreate([0, 1], varOleStr);
keys[0] := WideString('a');
keys[1] := WideString('b');
// don't forget to create the COM object instance
// before trying to call any of its methods... 
MyClassInstance := TMyClass.Create;
myClassInstance.MyFunc(url, keys);
end;

当您使用 Delphi 7 时,字符串<>宽字符串。

您是否如 Remy 的示例代码所示将显式强制转换为宽字符串?

相关内容

  • 没有找到相关文章

最新更新