我有一箇舊的VB6應用程序將其數據保存到一個ini文件,它希望它在Windows文件夾中。在VB6代碼中,我只是指向文件名(沒有路徑),它由Windows在Windows文件夾中自動定位。但是,在Windows 8和公司網絡上,Windows將文件移動到用戶帳戶,因此它出現在\ Users \ username \ AppData文件夾結構下。閱讀本地帳戶ini文件
VB6並不在意,它總是讀取「ipmdata.ini」,並從AppData文件夾中獲取Windows提供的特定用戶。
但是,我現在需要從C#應用程序讀取這個相同的ini文件。所以我添加了GetPrivateProfileString的定義,並給它提供了與VB6相同的參數。 C#代碼總是從windows文件夾中讀取文件,而不是VB6正在讀取和寫入的文件。
任何想法如何使C#調用做相同的VB6調用相同的API?
我已經嘗試了針對Framework 2.0的.Net應用程序,編譯爲x86並運行editbin來設置/ TSAWARE:NO上的最終可執行文件(儘管我不知道如何檢查該功能 - 它只是沒有'失敗')。
VB6的代碼包含一個聲明和讀的:
Public Declare Function GetPrivateProfileString Lib "kernel32" _
Alias "GetPrivateProfileStringA" (_
ByVal lpApplicationName As String, _
ByVal lpKeyName As Any, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long, _
ByVal lpFileName As String) As Long
nRetcode = GetPrivateProfileString("PCD", "TemplateFolder", "", sTemp, 512, "mystuff.ini")
在C#應用程序的等效代碼包括:
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
static extern uint GetPrivateProfileString(
string lpAppName,
string lpKeyName,
string lpDefault,
StringBuilder lpReturnedString,
uint nSize,
string lpFileName);
StringBuilder sb = new StringBuilder(2048);
GetPrivateProfileString("PCD", "TemplateFolder", "", sb, 2048, "mystuff.ini");
沒有什麼別的測試程序恰好這個代碼閱讀ini文件。 C#代碼讀取當前在我的\ Windows文件夾中的ini,並從\ users \ user \ appdata \ virtualstore \ windows文件夾中讀取VB6代碼。
如果您在當前使用的VB和C#中顯示讀取ini文件的相關代碼,這將有所幫助。如果你只是在VB中使用私有聲明函數GetPrivateProfileString Lib「kernel32」',並且在C#中使用'[DllImport(「kernel32.dll」] static extern uint GetPrivateProfileString()',我懷疑API調用會導致這種行爲,因爲它們是也可能有其他代碼干擾路徑,或者API調用在當前目錄中查找,這可能會因不同的應用程序而有所不同 – CodeCaster
另外,當移植依賴於[古代WinAPI調用](http ://msdn.microsoft.com/en-us/library/windows/desktop/ms724353(v = vs.85).aspx),您可能需要考慮[使用庫](https://code.google。 com/p/ini-parser /)來替換它們。 – CodeCaster
由於您正在將應用程序移植到.NET,爲什麼不移植.ini呢?您可以將設置添加到app.config文件。配置文件存儲在與應用程序相同的文件夾中。這是一個MSDN文章,其中有更詳細的解釋。 http://msdn.microsoft.com/en-us/library/a65txexh.aspx – jac