Hilfe zu DllImport



  • Hallo,

    ich brauche eure Hilfe bezüglich des DllImports einer ANSI-C Dll in mein C#-Projekt. Ich habe eine bereitgestellte ANSI-C Dll, von der ich gerne ein paar Funktionen in meinem C#-Projekt nutzen möchte....

    Hier sind einge der Prototypen aus dem Header der C-Dll:

    __export int __stdcall InitEx(long *hDBHandle,char *sFileName, char *sUserName, char *sPassWord, char *sDBName);
    
    __export int __stdcall InvokeProc(long *hDBHandle, char *sProcName);
    
    __export int __stdcall GetActiveTaskNumbers(long hDBHandle, 
                                   char **pTaskNumbers,
                                   char **pTaskStatus,
                                   int  *iTaskCount,
                                   int  iAllFacilities);
    

    Jetzt versuche ich, diese Funktionen mittels "DllImport" in mein Programm zu laden.

    [DllImport("Test.dll", EntryPoint = "InitEx")]
            public static extern int Init(IntPtr hDBHandle, string sFileName, string sUserName, string sPassWord, string sDBName);
    

    Compilieren lässt sich das Projekt, jedoch kommt beim Aufruf der jeweiligen Funktion der Fehler:

    Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.

    Kann mir einer einen Tipp geben, wie ich dir Argumentenliste richtig definieren kann? Vor allem macht mit der Datentyp long* kopfzerbrechen.

    Vielen Dank für eure Hilfe!
    Gruß



  • Ich würde anstelle von string den System.Text.StringBuilder in der C# Signatur verwenden. Oder sollten etwa die char* eher const char* sein?

    Allg. Artikel: Ev. mal mit der Calling Convention spielen...
    http://msdn.microsoft.com/en-us/magazine/cc164123.aspx

    Hier noch ein Tool, welches Dir die Signatur erstellt:
    http://clrinterop.codeplex.com/



  • Danke theta für deine Antwort...

    Ich hatte in der Zwischenzeit auch mal mit StringBuilder gespielt. Jedoch bin ich mir vor allem bei der Signatur für den "long* " Datentyp unsicher!!

    Wenn ich die Funktion aufrufe kommt anstelle der Exception nun ein Rückgabewert zurück. Das ist schon mal gut, jedoch wird -1 als Fehlerfall zurückgegeben. Doof ist auch, dass ich an dieser Stelle nicht in den Code debuggen kann, warum ein Fehler zurückgegeben wird. Würdest du den long* auch so umsetzen?

    Danke!!



  • Würdest du den long* auch so umsetzen?

    Ja. Oder dann aber aber als

    ref int
    

    .

    Doof ist auch, dass ich an dieser Stelle nicht in den Code debuggen kann, warum ein Fehler zurückgegeben wird.

    Lies die Antwort von Jochen: http://www.c-plusplus.net/forum/282645


Log in to reply