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 有错的??

解决方案 »

  1.   

    CString temp = sPath + _T("\\") + HOOKDOTEXE;
      

  2.   

    HOOKDOTEXE 你查过这个变量的内容吗??
      

  3.   

    调试时,可以看到.
    sPath和HOOKDOTEXE肯定有值
      

  4.   

    MAX_PATH这个宏是多少??
      

  5.   

    MessageBox(NULL,temp,"x",MB_OK); // 这样做可以吗?怎么我有错误的我改成::MessageBox(NULL,temp,"x",MB_OK); 才可以的
      

  6.   

    我帮你试过了,这么写肯定没问题呀,你中间是不是还有代码,用到了HOOKDOTEXE.ReleaseBuffer()呀??
      

  7.   

    sPath用了
    sPath.ReleaseBuffer();但
    HOOKDOTEXE并没有调用.你试了真的是可以吗?.怎么我这边不行,我已经新开一工程运用上面的代码了,还是不行,晕
      

  8.   

    晕,刚看到
    GetModuleFileName(AfxGetInstanceHandle(),sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH); 
    你的spath怎么用的是GetBufferSetLength()呀??
    换成GetBuffer试试
      

  9.   

    CString作缓存的话,GetBuffer之后都应该ReleaseBuffer
      

  10.   

    你把CString temp = sPath + "\\" + HOOKDOTEXE;
    分开写吧,写成:
    CString temp = sPath;
    temp+="\\";
    temp+=HOOKDOTEXE;然后调试一下,看看到底是哪句的问题
      

  11.   

    问题出在temp+=HOOKDOTEXE;CString + 常量没有问题
    如果两个CString ++ 就有问题了.
    不知我这里的环境为什么会这样
      

  12.   

    GetPrivateProfileString("HOOKEXE","exename",
    "HOOKDOTEXE.EXE",HOOKDOTEXE.GetBuffer(100),100,
    sPath + "\\config.ini");这么写试试,感觉可能是那个宏有问题
      

  13.   

    1。是不是还有别的地方定义了HOOKDOTEXE?
    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了。
      

  14.   

    //读取要运行的文件
    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);
    这样对了,非常谢谢各位的帮助.