Использование COM-DLL в delphi - нарушение прав доступа в ошибке MSVCR80D.dll

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

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

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

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

процедура TForm1.buttonClick (Отправитель: TObject);
вар
  valReq: TValidationRequest;
  s1, s2, s3, s4, s5: WideString;
  о: WideString;
начинать
  valReq: = TValidationRequest.Create (Самостоятельно);
  пытаться
    valReq.Process (s1, s2, s3, s4, o);
    MessageDlg (o, mtInformation, [mbOK], 0);
  наконец
    valReq: = ноль;
  конец;
конец;

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

Вы можете предложить какое-нибудь решение?

Ответов (2)

Решение

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

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