很多时候,用户自己点击打开read.exe加载的时候都没有问题,读取ini配置文件也没有问题。但是如果应用程序是开机启动呢?32位Windows系统当前目录是C盘的windows\system32;而64位系统软件启动后默认的当前目录是:C:\Windows\SysWOW64,这个时候如果系统中不存在ini文件,就会报错找不到了。
C#代码:
string databasePath = Environment.CurrentDirectory + "\\DXConfig.ini"; //程序工作目录,工作目录是应用程序启动的目录,例如开机启动程序调用read.exe,则是系统的32或者64目录。
string databasePath = Application.StartupPath + "\\DXConfig.ini";//应用程序的安装目录
///////////////////////////////////////////C# 读取config.ini里面内容///////////////////////////////////////////
string filePath = Application.StartupPath + "\\DXXconfig.ini";
string IsReadIDCard = "";
string IsReadSSCard = "";
IsReadIDCard = INIHelper.ReadFromINI(filePath, "Config", "IsReadIDCard").Replace(" ", "");
IsReadSSCard = INIHelper.ReadFromINI(filePath, "Config", "IsReadSSCard").Replace(" ", "");
//写INI文件:
INIHelper.WriteToINI(filePath, "Config", "IsReadIDCard", "true");
#region 读写ini配置文件
/// <summary>
/// 对INI文件进行读写
/// </summary>
class INIHelper
{
/// <summary>
/// 从INI文件中读取数据
/// </summary>
/// <param name="filePath">INI文件的全路径</param>
/// <param name="rootValue">根节点值,例如根节点[ConnectString]的值为:ConnectString</param>
/// <param name="key">根节点下的键</param>
/// <param name="defValue">当标记值未设定或不存在时的默认值</param>
/// <returns></returns>
public static string ReadFromINI(string filePath, string rootValue, string key, string defValue = "")
{
//StringBuilder sb = new StringBuilder(1024);
//GetPrivateProfileString(rootValue, key, defValue, sb, 1024, filePath);
//return sb.ToString();
//改成支持中文ini配置
byte[] retVal = new byte[255];
int i = GetPrivateProfileString(rootValue, key, defValue, retVal, 1024, filePath);
string s = Encoding.UTF8.GetString(retVal, 0, i);
return s.ToString();
}
public static void WriteToINI(string filePath, string rootValue, string key, string newVal)
{
WritePrivateProfileString(rootValue, key, newVal, filePath);
}
/// <summary>
/// 对INI文件进行读取操作
/// </summary>
/// <param name="IpAppName">表示INI文件内部根节点的值</param>
/// <param name="IpKeyName">表示根节点下子标记的值</param>
/// <param name="IpDefault">表示当标记值未设定或不存在时的默认值</param>
/// <param name="IpReturnString">返回读取节点的值</param>
/// <param name="nSize">读取的节点内容的最大容量</param>
/// <param name="IpFileName">文件的全路径</param>
/// <returns></returns>
[System.Runtime.InteropServices.DllImport("kernel32")]
//static extern int GetPrivateProfileString(string IpAppName, string IpKeyName, string IpDefault, StringBuilder IpReturnString, int nSize, string IpFileName); //不支持中文,中文会乱码
static extern int GetPrivateProfileString(string IpAppName, string IpKeyName, string IpDefault, byte[] retVal, int nSize, string IpFileName);//改成支持中文ini配置
/// <summary>
/// 对INI文件进行写入操作
/// </summary>
/// <param name="mpAppName">INI文件内部根节点的值</param>
/// <param name="mpKeyName">将要修改的标记名称</param>
/// <param name="mpDefault">想要修改的内容</param>
/// <param name="mpFileName">INI文件的全路径</param>
/// <returns></returns>
[System.Runtime.InteropServices.DllImport("kernel32")]
static extern long WritePrivateProfileString(string mpAppName, string mpKeyName, string mpDefault, string mpFileName);
}
#endregion
C++代码:
TCHAR NowPath[MAX_PATH];
if (!GetModuleFileName(NULL, NowPath, MAX_PATH))//获取exe可执行文件的绝对路径
{
MessageBox(NULL, "GetModuleFileName failed", "报错", MB_OK);
//printf("GetModuleFileName failed (%d)\n", GetLastError());
return FALSE;
}
PathRemoveFileSpec(NowPath);//将路径末尾的文件名和反斜杠去掉
SetCurrentDirectory(NowPath);//设置当前应用程序新当前目录的路径
char NowPaths[512] = "";
strcat(NowPaths, NowPath);
strcat(NowPaths, "\\DXConfig.ini");
///////////////////////////////////////////C++ 读取config.ini里面内容///////////////////////////////////////////
string url_hb = "";
TCHAR NowPath[MAX_PATH];
if (!GetModuleFileName(NULL, NowPath, MAX_PATH))//获取exe可执行文件的绝对路径
{
MessageBox(NULL, "GetModuleFileName failed", "报错", MB_OK);
//printf("GetModuleFileName failed (%d)\n", GetLastError());
return FALSE;
}
PathRemoveFileSpec(NowPath);//将路径末尾的文件名和反斜杠去掉
SetCurrentDirectory(NowPath);//设置当前应用程序新当前目录的路径
char NowPaths[512] = "";
strcat(NowPaths, NowPath);
strcat(NowPaths, "\\DXConfig.ini");
LPTSTR Lp_Path = new char[MAX_PATH];
strcpy(Lp_Path, NowPaths);
LPTSTR Lp_url_hb = new char[48];
LPTSTR Lp_url_nbrz = new char[48];
GetPrivateProfileString("URLConfig", "url_hb", "", Lp_url_hb, 48, Lp_Path);
url_hb = Lp_url_hb;
delete[] Lp_Path;

1021

被折叠的 条评论
为什么被折叠?



