Unter Verwendung einer COM-DLL in delphi - Zugriffsverletzung in MSVCR80D.dll Fehler
-
06-09-2019 - |
Frage
Ich brauche eine DLL zu verwenden, erstellt .NET Framework. Diese DLL wird COM sichtbar.
Ich mag diese DLL in einer Anwendung verwenden, erstellt mit Delphi 2006 Ich habe folgende Schritte durchgeführt:
- Hier die DLL mit regscr32.
-
der Typ-Bibliothek importiert mit Delphi-IDE. Es schuf _TLB.pas Datei. Nach der Unterzeichnung wurde in TLB-Datei erstellt.
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;
-
Ich habe versucht, die Methode aufzurufen mit folgender Code-Schnipsel.
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;
Aber ich bekomme folgende Fehlermeldung bei Prozessmethode aufgerufen wird.
Bitte können Sie vorschlagen, eine Lösung?
Lösung
Versuchen Sie, die WideStrings
Initialisieren (s1
, s2
, s3
, s4
, und vielleicht sogar o
). Wenn ich mich richtig erinnere, sind sie dynamisch in Delphi und nil (000000000), bevor Sie sie einrichten.
Andere Tipps
Zusätzlich zu dem, was MarkusQ sagte, beachten Sie, dass Ihre Speicherverwaltung des TValidationRequest
Objekt ist nicht so gut. Es wäre sauberer Create(nil)
zu verwenden und dann im finally
-Blockschreib FreeAndNil(valReq)
. Die Art und Weise wird es Ihnen jetzt ein TValidationRequest
-Objekt zu erstellen, jedes Mal, wenn Sie auf die Schaltfläche klicken und sie werden im Speicher alle bleiben, bis Sie das Formular zerstören. Zumindest werden Sie nicht Speicherlecks, weil Sie Self
an den Konstruktor übergeben, so zumindest die Form Pflege zu zerstören diese Objekte nehmen. In Ihrem Beispiel gibt es wirklich keine Notwendigkeit, das Objekt am Leben zu halten, nachdem die TForm1.buttonClick
Verfahren beendet sind.