P/INvoke der WinAPI (GetTempPath und GetModuleFileName)



  • Hi Leute! Wie kann ich die beiden oben angeführten WinAPI Calls in C# aufrufen?

    C++:

    DWORD WINAPI GetTempPath(
      __in   DWORD nBufferLength,
      __out  LPTSTR lpBuffer
    );
    
    DWORD WINAPI GetModuleFileName(
      __in_opt  HMODULE hModule,
      __out     LPTSTR lpFilename,
      __in      DWORD nSize
    );
    

    und nun C#:

    [DllImport("Kernel32.dll")]
    private static extern uint GetModuleFileName(
         IntPtr hModule, 
         out string lpFilename, 
         out uint nSize);
    
    [DllImport("Kernel32.dll")]
    private static extern uint GetTempPath(uint nBufferLength, [MarshalAs
         (UnmanagedType.LPTStr)]string lpBuffer);
    

    Das Ganze funktioniert leider nicht 😞
    Wie muss es sonst aussehen damit es funktioniert und wie rufe ich die Methoden auf? -> Besonders interessant ist es bei dem IntPtr in C## "null" zu übergeben, da dies ein optionaler param ist und wenn !? null wird er verwendet!

    herzlichen dank für eure antworten



  • „Funktioniert nicht“ ist einfach keine Fehlerbeschreibung!

    Abgesehen hast Du bei der Übersetzung einen Fehler gemacht, der dritte Parameter bei 'GetModuleFileName' ist kein 'out'-Parameter.

    Und den zweiten Parameter sollte man wohl auch besser nicht als 'out' deklarieren sondern analog zu der anderen Deklaration, der wird dann automatisch gemarshallt. Generell empfiehlt es sich aber, hier statt eines Strings in beiden Fällen einen 'StringBuilder' zu übergeben, das macht es einfacher.



  • Die Frage ist wofür du die überhaupt benötigst.
    Für GetTempPath gibts Path.GetTempPath und GetModuleFileName brauchst du auch net da die Process Klasse dir das komfortabel schon anbietet. Die Process Klasses bietet das Modules Property welches ne Liste von ProcessModul ist und darüber kannst du alles mögliche abfragen, auch den File Name des Moduls.



  • Du müsstest IMO die StringBuilder Klasse verwenden können. Lies mal den Artikel:

    http://msdn.microsoft.com/en-us/library/x3txb6xc(VS.71).aspx

    Interessant für dich wäre hier das Beispiel mit GetSystemDirectory.


Anmelden zum Antworten