Использование COM DLL в delphi - нарушение прав доступа в MSVCR80D.dll ошибка - PullRequest
4 голосов
/ 25 февраля 2009

Мне нужно использовать DLL, созданную с использованием .NET Framework. Эта DLL сделана видимой для COM.

Я хочу использовать эту DLL в приложении, созданном с помощью Delphi 2006. Я выполнил следующие шаги:

  1. Зарегистрирован DLL с помощью regscr32.
  2. Импортированы библиотеки типов с использованием Delphi IDE. Это создано _TLB.pas файл. Следующая подпись была создана в файле TLB.

    function TValidationRequest.Process(var meterBSN: WideString; var NICSerial: WideString; 
                                        var partNumber: WideString; var otherConfig: WideString; 
                                        out returnMessage: WideString): Smallint;
    begin
      Result := DefaultInterface.Process(meterBSN, NICSerial, partNumber, otherConfig, returnMessage);
    end;
    
  3. Я пытался вызвать метод, используя следующий фрагмент кода.

procedure TForm1.buttonClick(Sender: TObject);
var
  valReq: TValidationRequest;
  s1, s2, s3, s4, s5: WideString;
  o: WideString;
begin
  valReq := TValidationRequest.Create (Self);
  try
    valReq.Process (s1, s2, s3, s4, o);
    MessageDlg(o, mtInformation, [mbOK], 0);
  finally
    valReq := nil;
  end;
end;

Но я получаю следующую ошибку при вызове метода Process. alt text

Можете ли вы предложить какое-либо решение?

Ответы [ 2 ]

6 голосов
/ 25 февраля 2009

Попробуйте инициализировать WideStrings (s1, s2, s3, s4 и, возможно, даже o). Если я правильно помню, они динамические в Delphi и nil (000000000) до того, как вы их настроите.

2 голосов
/ 25 февраля 2009

В дополнение к тому, что сказал MarkusQ, обратите внимание, что ваше управление памятью объекта TValidationRequest не так хорошо. Было бы чище использовать Create(nil), а затем в finally -блоке написать FreeAndNil(valReq). Теперь вы создаете один TValidationRequest объект каждый раз, когда нажимаете кнопку, и все они остаются в памяти до тех пор, пока вы не уничтожите форму. По крайней мере, вы не получите утечек памяти, потому что вы передали Self в конструктор, так что, по крайней мере, форма позаботится об уничтожении этих объектов. В вашем примере действительно нет необходимости поддерживать объект живым после завершения метода TForm1.buttonClick.

...