2010-07-09 238 views
2
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias _ 
     "GetPrivateProfileStringA" (ByVal lpApplicationName As String, _ 
      ByVal lpKeyName As String, _ 
      ByVal lpDefault As String, _ 
      ByVal lpReturnedString As String, _ 
      ByVal nSize As Integer, ByVal lpFileName As String) As Integer 
Dim value As String = "" 
Dim length As Integer 
Dim IniFileName As String 

GetPrivateProfileString("Config", "UserName", "None", value, length, IniFileName) 

value包含一個空字符串!?GetPrivateProfileString()返回空字符串,儘管有一個默認

我承認自己是VB n00b,實際上不到一週,但我看不出有什麼問題。該文件存在,它包含一個名爲「Config」的部分,其中有一個名爲「UserName」的條目 - 但即使沒有,也不會value採用默認值?

(而且,不,我不想使用註冊表,感謝;-)


編輯:它不返回一個空字符串 - 它返回無論我打電話GetPrivateProfileString()之前初始化value來。

這就是說,如果我

Dim value As String = "xxx" 

那麼它還是老樣子包含調用,而不是默認值後,「XXX」。

+1

我試圖將函數聲明推入代碼塊,但由於某種原因,它沒有它 - 只是因爲你想知道爲什麼我編輯了你的問題:) – Rob 2010-07-09 09:10:26

回答

3

您必須在params中設置大小,併爲結果保留空間。 在調用函數之前插入此行:

value = space(255) 
length = len(value) 

忘記的東西:你必須使用的函數的返回值,因爲這是你得到的實際值的長度,並使用Left(value,length)獲得你的真實答案。

2

初始化lengthvalue如下:

Dim length As Integer = 255 
Dim value As String = New String(" "c, length) 

此外,根據您發佈的代碼,IniFileName似乎空。也許你還需要在那裏分配一個值?

0

看看PInvoke.net的示例,您用於調用GetPrivateProfileString的簽名不太正確。具體來說,PInvoke.net上顯示的簽名通過StringBuilder和stringbuilder的大小。

在您的示例中,您正在傳遞一個空字符串和一個零長度,所以對GetPrivateProfileString的調用將只返回一個空的(零長度)字符串,因爲您告訴它輸出緩衝區值)你傳入適合於一個零長度的字符串。

爲了得到你期待的結果,你的代碼,因此必須:

Imports System.Runtime.InteropServices 
Imports System.Text 

Module Module1 
    Private Declare Auto Function GetPrivateProfileString Lib "kernel32" (ByVal lpAppName As String, _ 
       ByVal lpKeyName As String, _ 
       ByVal lpDefault As String, _ 
       ByVal lpReturnedString As StringBuilder, _ 
       ByVal nSize As Integer, _ 
       ByVal lpFileName As String) As Integer 

    Sub Main() 
     Dim value as String 
     Dim result As Integer 
     Dim sb As StringBuilder 
     Dim IniFileName As String = "PathAndFilenameGoesHere" 

     sb = New StringBuilder(300) 
     result = GetPrivateProfileString("Config", "UserName", "", sb, sb.Capacity,IniFileName) 
     value = sb.ToString() 

    End Sub 
End Module 
+1

-1:我盯着使用pinvoke簽名,然後切換到OP簽名,這需要更少的代碼和工作沒有問題 – Zac 2014-10-15 13:44:07

1

FYI:

您還可以得到一個空字符串,如果您的默認值是「」和你提供的文件名該文件不存在,或者提供沒有完整路徑的文件名。 GetPrivateProfileString()如果找不到源文件並僅使用默認值,則不會返回錯誤。

2

確保您的INI文件的代碼頁是ANSI。 我得到空結果,因爲我的ini是UTF-8。

對我來說並不明顯。

+1

我在Visual Studio中創建一個ini文件。它在文件的開頭放置了3個字節,完全打破了這個功能。花了45分鐘弄清楚了。在HexEdit中查看文件(並在上面看到此評論)後,我刪除該文件並在Sublime Text中重新創建該文件。完美工作。不要使用VS文本編輯器! – DrDamnit 2017-02-06 20:49:13