阅读本地帐户ini文件

时间:2014-01-26 12:03:30

标签: c# .net vb6 ini

我有一个旧的VB6应用程序,它将数据保存到一个ini文件,它希望在windows文件夹中。在VB6代码中,我只是引用文件名(没有路径),它在Windows文件夹中由Windows自动定位。但是,在Windows 8和公司网络上,Windows会将文件移动到用户帐户,因此它显示在\ Users \ username \ AppData文件夹结构下。

VB6可能不在乎,它总是读取“ipmdata.ini”并获取用户特定的一个由Windows从AppData文件夹传递给它。

但是,我现在需要从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,VB6代码从\ users \ user \ appdata \ virtualstore \ windows文件夹中读取。

2 个答案:

答案 0 :(得分:0)

您是否尝试过指定完整路径?

GetPrivateProfileString("PCD", "TemplateFolder", "", sb, 2048, Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\mystuff.ini");

答案 1 :(得分:0)

这里有很多误解。

UAC于2006年开始使用Windows Vista,而不是Windows 8。

文件系统虚拟化不是应用程序功能,而是一个错误。微软明确警告程序员不要依赖它。

你的.Net程序可能有一个标记为Vista Aware的清单,在这种情况下虚拟化永远不适用。

这似乎与Force an existing application to always run with UAC virtualization on

重复

基本上,真正的答案是修复您的程序,使其不需要虚拟化。