0

我有一个 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 生成所需的文件。看起来我已经可以在 Delphi 中引用 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 Editor):

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

我应该如何在 Delphi 中将正确的参数传递给这个 DLL?

4

2 回答 2

1

在 COM 级别,DLL 期望您传入VARIANT包含 aSAFEARRAYBSTR字符串。VB 和 C# 使用更高级别的语法向您隐藏这些细节。

在 Delphi 中,WideString是 的包装器BSTR,您可以使用 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;
于 2018-05-24T02:18:01.823 回答
0

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

您是否包括如 Remy 的示例代码中所示的对宽字符串的显式强制转换?

于 2018-05-26T04:10:30.033 回答