2009-02-25 9 views
4

Je dois utiliser une DLL créée à l'aide de .NET Framework. Cette DLL est rendue COM visible.Utilisation d'une DLL COM dans delphi - Violation d'accès dans l'erreur MSVCR80D.dll

Je veux utiliser cette DLL dans une application créée en utilisant Delphi 2006. J'ai suivi les étapes suivantes:

  1. a enregistré la DLL à l'aide regscr32.
  2. Importation de la bibliothèque de types à l'aide de l'IDE Delphi . Il a créé le fichier _TLB.pas. La signature suivante a été créée dans le fichier 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. J'ai essayé d'appeler la méthode en utilisant suivant extrait de code.

 
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; 

Mais je reçois l'erreur suivante lorsque la méthode de processus est appelé. alt text http://i41.tinypic.com/2daf1ix.png

Pouvez-vous suggérer une solution?

Répondre

6

Essayez d'initialiser le WideStrings (s1, s2, s3, s4, et peut-être même o). Si je me souviens bien, ils sont dynamiques en Delphi et nil (000000000) avant de les configurer.

+0

Vous rock MarkusQ! Merci beaucoup. Je vous aurais donné 100 votes si je pouvais. :) – Hemant

+0

Beau travail! C'est ce que j'ai remarqué quand je l'ai regardé aussi. @Hermant: Pour une utilisation future, souvenez-vous que les variables locales (déclarées dans un corps de méthode) sont pour la plupart (chaînes exceptées) non initialisées et peuvent contenir n'importe quoi. Vars déclaré globalement ou en tant que champs membres d'une classe sont définis par défaut. –

2

En plus de ce que dit MarkusQ, notez que la gestion de la mémoire de l'objet TValidationRequest n'est pas très bonne. Il serait plus propre d'utiliser Create(nil) puis dans le bloc finally, d'écrire FreeAndNil(valReq). La façon dont il est maintenant vous créez un objet TValidationRequest chaque fois que vous cliquez sur le bouton et ils resteront tous en mémoire jusqu'à ce que vous détruisiez le formulaire. Au moins vous n'obtiendrez pas de fuites de mémoire car vous avez passé Self au constructeur afin qu'au moins le formulaire prenne soin de détruire ces objets. Dans votre exemple, il n'est vraiment pas nécessaire de garder l'objet en vie après la fin de la méthode TForm1.buttonClick.

+0

Entièrement d'accord avec votre point. En fait, j'ai créé l'extrait de code pour une meilleure compréhension de la question. Cela ne fait pas partie de mon code de production :) Merci de m'avoir fait remarquer! – Hemant