我有一个旧的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文件夹中读取。
答案 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
重复基本上,真正的答案是修复您的程序,使其不需要虚拟化。