因为代码主要是写Win32在DLL中,所以MFC的东东应该用不了:
const LPCSTR MsgFileMapping_ProtectedProcessID = "WM_Test" ;
//根据传入的字符串生成一个全局的名称
string GetFileMappingName(LPCSTR msgFileMappingName) { int shareID = RegisterWindowMessage(msgFileMappingName); string mappingID = long2string(shareID); string mappingName = "File_Mapping_ID_" + mappingID ; return mappingName; }
//写入ProcessID到内存文件映射对象区 HANDLE SetProtectedProcessID(DWORD processID) { LPCSTR mappingName = GetFileMappingName(MsgFileMapping_ProtectedProcessID).c_str(); MessageBox(0,mappingName,"",0); //这是调用,这里有乱码,有时正常显示,有时不正常 return CreateFileMappingData(mappingName,processID); }
其实我想要的功能就是 生成一个字符串如下:
"File_Mapping_ID_" + int类型 -》转换成 LPCSTR
这样,我就可以传给CreateFileMapping函数了。
C++的字符串真真的可以把人弄死,太复杂了,还是VB,C#好啊。
//这里GetFileMappingName返回的是string的值,string返回值GetFileMappingName在函数结束调用的时候就被消毁了,mappingName获取的字符串指针就变成了野指针
LPCSTR mappingName = GetFileMappingName(MsgFileMapping_ProtectedProcessID).c_str();
改为:
string mappingName = GetFileMappingName(MsgFileMapping_ProtectedProcessID);
MessageBox(0,mappingName.c_str(),"",0);
CreateFileMappingData(mappingName.c_str(),processID);
够幽默,“野指针”,哈哈,领教了。试试先。
确实如大仙的所言,没有乱码了。但我还是没有听懂,这个函数GetFileMappingName返回的string为什么就叫野指针呢? 是在哪里销毁了哪个指针,在哪里引用的时候它变成了野指针,吾乃初学,还望大仙不吝赐教。
关于野指针, C++对象生命周期,你还是到网上搜下,一句两句说不清,看过之后估计你就应该明白了
GetFileMappingName 返回的是 std:string 对象
std::string.c_str() 返回 std::string 内部缓冲区的首地址。
LPCSTR mappingName = GetFileMappingName(MsgFileMapping_ProtectedProcessID).c_str();
这段代码等效于:
LPCSTR mappingName = NULL;
{
std::string str = GetFileMappingName(MsgFileMapping_ProtectedProcessID);
mappingName = str.c_str();
// 代码执行到这里,mappingName 指向的地址仍然有效,因为 str 还没有被销毁,也就没有释放 mappingName 指向的地址空间。
}
// 代码执行到这里,str 变量已经被销毁,其内部缓冲区也被释放,那么 mappingName 指向的地址已经不再可用。
哇,C++这么危险啊,外部变量对它有引用,它竟然也会被释放。看来这生命周期和C#之类确实相差太大了,受教了,谢谢。
@沧海一杰: 分太少了,不要见怪。