2016-06-15 37 views
1

我試圖在我的Windows Phone 8.1應用程序中調用GetDiskFreeSpaceExW Win Api調用,並且我始終未通過認證。從WindowsPhone 8.1調用GetDiskFreeSpaceExW api

此功能是支持的Win32 API的列表: https://msdn.microsoft.com/en-us/library/windows/apps/jj662956(v=vs.105).aspx#BKMK_ListofsupportedWin32APIs

我的電話:

 [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:

此API不支持此應用程序類型 - API = GetDiskFreeSpaceEx。模塊= API-MS-雙贏的核心文件l1-2-0.dll。 File = Glide.WindowsCommon.dll。

我在這裏錯過了什麼?

+1

是否認證失敗報告什麼? –

+0

是的,它告訴我從api-ms-win-core-file-l1-2-0.dll中刪除了這個函數(GetDiskFreeSpaceEx) –

回答

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); 

因爲你沒有指定(通過認證)+字符集= CharSet.Unicode爲一個CharSet的值,默認情況下這是CharSetCharSet.Ansi編組。您應指定CharSet.Unicode像這樣:

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

看來,認證過程也需要入口點名稱的顯式聲明:

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

我仍然需要將其名稱更改爲GetDiskFreeSpaceExW以便通過... –

+1

我有點驚訝。讓我們試着來解決這個問題。您可以將名稱保留爲'GetDiskFreeSpaceEx'並將'EntryPoint =「GetDiskFreeSpaceExW」'添加到'DllImport'規範中嗎?在我看來,這將是最簡單的方法來破解這一個。 –

+1

@PavelDurov - 您也可以使用'DllImportAttribute'上的'EntryPoint'屬性來指定您需要不同的函數導出名稱。編輯:看來,大衛Heffernan打我吧 – theB

0

這是非常混亂,只需從GetDiskFreeSpaceEx改變函數名GetDiskFreeSpaceExW曾在@大衛赫弗南答案:)

+1

根本沒有讓人困惑。所有處理字符串的Windows API函數分別以ANSI(窄)和wide(Unicode)字符串形式出現在「A」和「W」後綴的版本中。這通常是通過頭文件中定義的宏來排序的,但當你是P/Invoking時,並不是這樣。使用函數的實際名稱可以起作用,David的解決方案使用'CharSet'屬性。 –

+0

這是confusin,我希望它叫作GetDiskFreeSpaceExW如果我設置CharSet = CharSet.Unicode沒有重命名實際的函數名稱。 –