CString sPath;
CString sexename; GetModuleFileName(AfxGetInstanceHandle(),sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
sPath.ReleaseBuffer();
int nPos;
nPos=sPath.ReverseFind ('\\');
sexename = sPath.Right(sPath.GetLength()-nPos-1);
sPath=sPath.Left (nPos);
//读取要运行的文件
CString HOOKDOTEXE;
GetPrivateProfileString("HOOKEXE","exename",
"HOOKDOTEXE.EXE",HOOKDOTEXE.GetBuffer(MAX_PATH),MAX_PATH,
sPath + "\\config.ini");CString temp = sPath + "\\" + HOOKDOTEXE;MessageBox(NULL,temp,"x",MB_OK);//这里的temp的值错了,还是等于sPath,为什么?
config.ini内容
[HOOKEXE]
exename=dd.exe
CString + CString 有错的??
CString sexename; GetModuleFileName(AfxGetInstanceHandle(),sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
sPath.ReleaseBuffer();
int nPos;
nPos=sPath.ReverseFind ('\\');
sexename = sPath.Right(sPath.GetLength()-nPos-1);
sPath=sPath.Left (nPos);
//读取要运行的文件
CString HOOKDOTEXE;
GetPrivateProfileString("HOOKEXE","exename",
"HOOKDOTEXE.EXE",HOOKDOTEXE.GetBuffer(MAX_PATH),MAX_PATH,
sPath + "\\config.ini");CString temp = sPath + "\\" + HOOKDOTEXE;MessageBox(NULL,temp,"x",MB_OK);//这里的temp的值错了,还是等于sPath,为什么?
config.ini内容
[HOOKEXE]
exename=dd.exe
CString + CString 有错的??
sPath和HOOKDOTEXE肯定有值
sPath.ReleaseBuffer();但
HOOKDOTEXE并没有调用.你试了真的是可以吗?.怎么我这边不行,我已经新开一工程运用上面的代码了,还是不行,晕
GetModuleFileName(AfxGetInstanceHandle(),sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
你的spath怎么用的是GetBufferSetLength()呀??
换成GetBuffer试试
分开写吧,写成:
CString temp = sPath;
temp+="\\";
temp+=HOOKDOTEXE;然后调试一下,看看到底是哪句的问题
如果两个CString ++ 就有问题了.
不知我这里的环境为什么会这样
"HOOKDOTEXE.EXE",HOOKDOTEXE.GetBuffer(100),100,
sPath + "\\config.ini");这么写试试,感觉可能是那个宏有问题
2。不ReleaseBuffer你将不能进行CString的任何操作!1. GetBuffer很多错误用法中最典型的一个就是Cstring:: GetBuffer ()了.查了MSDN,里面对这个operation的描述是: Returns a pointer to the internal character buffer for the CString object. The returned LPTSTR is not const and thus allows direct modification of CString contents。这段很清楚的说明,对于这个operation返回的字符串指针,我们可以直接修改其中的值: CString str1("This is the string 1");――――――――――――――――1 int nOldLen = str1.GetLength();―――――――――――――――――2 char* pstr1 = str1.GetBuffer( nOldLen );――――――――――――――3 strcpy( pstr1, "modified" );――――――――――――――――――――4 int nNewLen = str1.GetLength();―――――――――――――――――5通过设置断点,我们来运行并跟踪这段代码可以看出,当运行到三处时,str1的值是”This is the string 1”,并且nOldLen的值是20。当运行到5处时,发现,str1的值变成了”modified”。也就是说,对GetBuffer返回的字符串指针,我们将它做为参数传递给strcpy,试图来修改这个字符串指针指向的地址,结果是修改成功,并且Cstring对象str1的值也响应的变成了” modified”。但是,我们接着再调用str1.GetLength()时却意外的发现其返回值仍然是20,但是实际上此时str1中的字符串已经变成了” modified”,也就是说这个时候返回的值应该是字符串” modified”的长度8!而不是20。现在Cstring工作已经不正常了!这是怎么回事?很显然,str1工作不正常是在对通过GetBuffer返回的指针进行一个字符串拷贝之后的。
再看MSDN上的关于这个operation的说明,可以看到里面有这么一段话:If you use the pointer returned by GetBuffer to change the string contents, you must call ReleaseBuffer before using any other CString member functions.原来在对GetBuffer返回的指针使用之后需要调用ReleaseBuffer,这样才能使用其他Cstring的operations。上面的代码中,我们在4-5处增建一行代码:str2.ReleaseBuffer(),然后再观察nNewLen,发现这个时候已经是我们想要的值8了。
CString HOOKDOTEXE;
GetPrivateProfileString("HOOKEXE","exename",
"HOOKDOTEXE.EXE",HOOKDOTEXE.GetBuffer(MAX_PATH),MAX_PATH,
sPath + "\\config.ini");
HOOKDOTEXE.ReleaseBuffer();
CString temp = sPath + "\\" + HOOKDOTEXE;
::MessageBox(NULL,temp,"x",MB_OK);
这样对了,非常谢谢各位的帮助.