Applikation beendet sich nach Aufruf einer DLL Funktion

mto

Grünschnabel
Hallo zusammen,

ich versuche eine dll (ANSI C) in C'# einzubinden. Das hat bis jetzt ganz gut funktioniert. Wenn ich nun eine Funktion der DLL aufrufe, wird die ausführende Anwendung ohne Fehlermeldung beendet.

Code:
        fixed (char* cPath = Path, cFileName = FileName)
        {
            MAKEDBDLL.precheck(cPath, cFileName);
        }

Ich habe noch ein Beispiel aus der Hilfe mit der MessageBox (user32.dll) ausprobiert. Damit funktioniert es ohne Probleme. Ich kann mir nur denken, dass es an den Pointern liegen. Hat von euch vielleicht einer eine Idee?

Hier noch mal der dllimport:

Code:
  public class MAKEDBDLL
  {
    [DllImport("makedbdll.dll")]
    public unsafe static extern int compile(char *pfad, char *datafile, char *sPassword, char *CNOOU, int nKeyUsage);
    [DllImport("makedbdll.dll")]
    public unsafe static extern int precheck(char *pfad, char *datafile);
    [DllImport("makedbdll.dll")]
    public unsafe static extern int testcompile(char *pfad, char *datafile, char *sPassword, char *CNOOU, int nKeyUsage);
    [DllImport("makedbdll.dll")]
    public unsafe static extern int compileKassen(char *pfad, char *datafile);
  }

Grüße Martin
 
Deine implmentation der Variablen ist offensichtlich falsch. Du darfst in C# keine Zeiger angeben.
Alle Variablen sind Zeiger auf Objekte. Überprüfe noch mal Dein Code oder sende ihn mal damit ich einen Blick rein werfen kann. Ich benutze regelmäßig Ansi C DLL Aufrufe und weiß was man alles falsch machen kann.
 
Ulrich Michalik hat gesagt.:
Deine implmentation der Variablen ist offensichtlich falsch. Du darfst in C# keine Zeiger angeben.
Alle Variablen sind Zeiger auf Objekte. Überprüfe noch mal Dein Code oder sende ihn mal damit ich einen Blick rein werfen kann. Ich benutze regelmäßig Ansi C DLL Aufrufe und weiß was man alles falsch machen kann.

Sorry Ulrich, C# hat Zeiger, und dieses fixed-Statement das mto verwendet, verhindert das Variablen im Speicher von der Garbage Collection neu angeordnet werden, sodass man keine Adressprobleme bekommt.
fixed Statement

mto, wird deine Funktion noch ausgeführt, oder beendet es sich sofort? Schonmal das ganze in einen Try-Catch Block gegeben?

MfG,
Alex
 
Hi Alexander,

direkt nach dem Aufruf der Funktion beendet sich das ausführende Programm mit dem Code 0.
Ich habe den Aufruf auch mal in ein try catch gepackt. Funktioniert aber auch nicht.

Code:
      {
        int nErrorIKData=0;
        string strPathIKData;
        string strFileNameIKData;
        char[] Path;
        char[] FileName;

        FileNamePath objFNPIKData = new FileNamePath();
        objFNPIKData.ExplodePathandFileName(txtIKData.Text);
        strFileNameIKData = objFNPIKData.GetFileName();
        strPathIKData = objFNPIKData.GetPath();
        Path = strPathIKData.ToCharArray();
        FileName = strFileNameIKData.ToCharArray();
        fixed (char* cPath = Path, cFileName = FileName)
        {
          try
          {
            Win32.MsgBox(this.Handle.ToInt32(),"Hallo","Hallo",2);          
            MAKEDBDLL.precheck(cPath, cFileName);
          }
          catch(Exception exp)
          {
            throw exp;
          }
        }        
      }

Die Funktion Win32.MsgBox wird ohne Probelem ausgeführt. Sobald die Funktion MAKEDBDLL.precheck aufruft, beendet sich das Programm.

Grüße

Martin
 
Mh, das "throw exp" ist nicht unbedingt gut, da wird ja nur nochmal eine Exception geworfen, ist nicht wirklich das Behandeln einer Exception. Jetzt müsstest noch einen Try-Catch Block haben. Schreib die Fehlermeldung, sofern überhaupt eine Auftritt, in eine Textdatei, oder mit einer MessageBox anzeigen.

Was sollte denn die externe Methode machen?
 
Die externe Funktion durchläuft Textdateien und prüft diese auf Plausibiltäten. Hier kann das Problem eigentlich nicht liegen, da ich die dll auch mit einer Powerbasic Anwendung anspreche. Und damit klappts.
 
Zurück