DLLImport



  • Hallo,

    hab ein paar Probleme mit dem DLL-Import und werde aus dem msdn nicht so ganz schlau. Vielleicht könnt Ihr mir ja helfen.

    Ich habe eine DLL (Smart.dll) welche in C++ geschrieben ist. Diese hat eine Funktion die mir einen Zeiger auf ein Struct zurück liefert.

    typedef struct 
    {
    	WORD wGenConfig;
    	WORD wNumCyls;
    	WORD wReserved;
    	WORD wNumHeads;
    	WORD wBytesPerTrack;
    	WORD wBytesPerSector;
    	WORD wSectorsPerTrack;
    	WORD wVendorUnique[3];
    	BYTE sSerialNumber[20];
    	WORD wBufferType;
    	WORD wBufferSize;
    	WORD wECCSize;
    	BYTE sFirmwareRev[8];
    	BYTE sModelNumber[39];
    	WORD wMoreVendorUnique;
    	WORD wDoubleWordIO;
    	WORD wCapabilities;
    	WORD wReserved1;
    	WORD wPIOTiming;
    	WORD wDMATiming;
    	WORD wBS;
    	WORD wNumCurrentCyls;
    	WORD wNumCurrentHeads;
    	WORD wNumCurrentSectorsPerTrack;
    	WORD ulCurrentSectorCapacity;
    	WORD wMultSectorStuff;
    	DWORD ulTotalAddressableSectors;
    	WORD wSingleWordDMA;
    	WORD wMultiWordDMA;
    	BYTE bReserved[127];
    } ST_IDSECTOR;
    

    Als erstes weiss ich nicht wie ich ein ByteArray (BYTE sSerialNumber[20]) nach C# marchaln kann, mh - Ansonsten sieht mein Ansatz so aus:

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct ST_IDSECTOR
    {
    	short wGenConfig;
    	short wNumCyls;
    	short wReserved;
    	short wNumHeads;
    	short wBytesPerTrack;
    	short wBytesPerSector;
    	short wSectorsPerTrack;
    	WORD wVendorUnique[3];     ???
    	BYTE sSerialNumber[20];    ???
    	short wBufferType;
    	short wBufferSize;
    	short wECCSize;
    	BYTE sFirmwareRev[8];      ???
    	BYTE sModelNumber[39];     ???
    	short wMoreVendorUnique;
    	short wDoubleWordIO;
    	short wCapabilities;
    	short wReserved1;
    	short wPIOTiming;
    	short wDMATiming;
    	short wBS;
    	short wNumCurrentCyls;
    	short wNumCurrentHeads;
    	short wNumCurrentSectorsPerTrack;
    	short ulCurrentSectorCapacity;
    	short wMultSectorStuff;
    	int ulTotalAddressableSectors;
    	short wSingleWordDMA;
    	short wMultiWordDMA;
    	BYTE bReserved[127];      ????
    };
    

    und zweitens weiss ich nicht wie ich dann auf diese Datenstruktur in C# zugreifen kann, denn die Funktion ist in c++
    so definiert:

    ST_IDSECTOR* IsDriveInfoAvailable(int DriveIndex);
    
    [DllImport("SmartDLL.dll")]
            public static extern ...???... IsDriveInfoAvailable(int DriveIndex);
    

    Was müsste ich wie anpassen?

    Danke



  • Vielleicht so?

    public static extern IntPtr IsDriveInfoAvailable(int DriveIndex);

    Die Datan von IsDriveInfoAvailable würde ich in eimem stream speichern, danach kannst du mit BinaryStream (MemoryStream?) die Variablen einzeln auslesen und in deine Strucktur schreiben.



  • Stichwort: unsafe



  • Gibt es eventuell noch eine andere Möglichkeit?



  • Ja, mit System.Runtime.InteropServices.Marshal aber die Arbeit bleibt die gleiche.



  • Ja, mit System.Runtime.InteropServices.Marshal aber die Arbeit bleibt die gleiche.

    Stimmit nicht ganz. Mit marshaling kannst du dir einiges an Arbeitet sparen, da du die Struktur nicht über das auslesen von einzelnen Werten auffüllen musst.

    Marshal.PtrToStructure(...)
    

    bzw.

    Marshal.StructureToPtr(...)
    

    erledigen das alleine.



  • Ein BYTE unter WinAPI ist ein byte unter C#.
    WORD ist Int16 (2 byte integer) (== short)


Anmelden zum Antworten