Передача массива строк из Delphi 7 в библиотеку COM Visible C # .net - PullRequest
0 голосов
/ 24 мая 2018

У меня есть C # DLL (.NET 2.0 framework), которая настроена как 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.

Я протестировал эту DLL в VB6, и она работает нормально.

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)

Теперь мне нужно использовать эту DLL в Delphi 7 (у меня нет предварительных знаний о Delphi).

Я использую Tlbimp для генерации необходимых файлов.Похоже, я уже могу ссылаться на DLL в Delphi, но она не работает:

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 в Delphi?

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Поскольку вы используете Delphi 7, строка <> widestring.

Включили ли вы явное приведение к widestring, как показано в примере кода Реми?

0 голосов
/ 24 мая 2018

На уровне COM, DLL ожидает, что вы передадите VARIANT, содержащее SAFEARRAY из BSTR строк.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;
...