2016-06-15 15 views
1

Ich versuche, GetDiskFreeSpaceExW Win API Aufruf in meiner Windows Phone 8.1-Anwendung aufrufen, und ich bin immer die Zertifizierung fehlgeschlagen.Aufruf von GetDiskFreeSpaceExW api von Windows Phone 8.1

Diese Funktion ist in der Liste der unterstützten Win32-APIs: https://msdn.microsoft.com/en-us/library/windows/apps/jj662956(v=vs.105).aspx#BKMK_ListofsupportedWin32APIs

Mein Ruf:

 [DllImport("api-ms-win-core-file-l1-2-0.dll", SetLastError = true)] 
     static extern bool GetDiskFreeSpaceEx(string lpDirectoryName, 
               out ulong lpFreeBytesAvailable, 
               out ulong lpTotalNumberOfBytes, 
               out ulong lpTotalNumberOfFreeBytes); 

erorr:

Diese API nicht für diesen Anwendungstyp unterstützt wird - Api = GetDiskFreeSpaceEx. Modul = api-ms-win-core-Datei-l1-2-0.dll. Datei = Glide.WindowsCommon.dll.

Was fehlt mir hier?

+1

Hat das irgendetwas Zertifizierung Fehlerbericht? –

+0

Ja, es sagt mir, dass diese Funktion (GetDiskFreeSpaceEx) aus api-ms-win-core-Datei-l1-2-0.dll –

Antwort

3
[DllImport("api-ms-win-core-file-l1-2-0.dll", SetLastError = true)] 
static extern bool GetDiskFreeSpaceEx(string lpDirectoryName, 
             out ulong lpFreeBytesAvailable, 
             out ulong lpTotalNumberOfBytes, 
             out ulong lpTotalNumberOfFreeBytes); 

Weil Sie nicht angegeben haben a CharSet Wert, wird standardmäßig mit CharSet von CharSet.Ansi marshallt. Sie sollten CharSet.Unicode wie so angeben:

[DllImport("api-ms-win-core-file-l1-2-0.dll", CharSet = CharSet.Unicode, 
    SetLastError = true)] 
static extern bool GetDiskFreeSpaceEx(...); 

Es scheint, dass der Zertifizierungsprozess explizite Angabe des Eintrittspunktes Name auch erfordert:

[DllImport("api-ms-win-core-file-l1-2-0.dll", CharSet = CharSet.Unicode, 
    Entry point = "GetDiskFreeSpaceExW", SetLastError = true)] 
static extern bool GetDiskFreeSpaceEx(...); 
+0

Ich muss noch seinen Namen in GetDiskFreeSpaceExW ändern, um zu übergeben ... –

+1

Ich bin ein wenig davon überrascht. Lassen Sie uns versuchen, das zu Ende zu bringen. Kannst du den Namen 'GetDiskFreeSpaceEx' und' EntryPoint = "GetDiskFreeSpaceExW" 'zur' DllImport' Spezifikation hinzufügen? Meiner Meinung nach wäre das der sauberste Weg, diesen zu knacken. –

+1

@PavelDurov - Sie können auch die Eigenschaft 'EntryPoint' im' DllImportAttribute' verwenden, um anzugeben, dass Sie einen anderen Funktionsexportnamen wünschen. Edit: Es scheint, dass David Heffernan mich dazu schlug – theB

0

Diese sehr verwirrend ist, einfach den Namen der Funktion von GetDiskFreeSpaceEx zu GetDiskFreeSpaceExW Wechsel gearbeitet (bestanden die Zertifizierung) + charset = CharSet.Unicode wie in @ David Heffernan Antwort :)

+1

nicht bereinigt ist. Alle Windows-API-Funktionen, die sich mit Zeichenfolgen befassen, werden entweder in einer "A" - und einer "W" -Suffixversion für ANSI- (schmale) und breite (Unicode) Zeichenfolgen bereitgestellt. Dies wird normalerweise durch Makros, die in den Header-Dateien definiert sind, aber nicht so ausgeführt, wenn Sie P/Invoking sind. Die Verwendung des tatsächlichen Namens der Funktion funktioniert ebenso wie Davids Lösung mit dem Attribut "CharSet". –

+0

Es ist confusin, ich würde erwarten, dass es als GetDiskFreeSpaceExW aufgerufen wird, wenn ich CharSet = CharSet.Unicode ohne Umbenennung des tatsächlichen Funktionsnamens festlegen. –