当我将指针传递给函数时,我得到的错误总是与内存相关的(此当前设置引发违反内存的异常)。
我尝试了各种实现方式来解决该问题,但没有任何效果。
这是代码:
在课堂上:
class OpenFileDialog {
public:
OpenFileDialog();
~OpenFileDialog();
static bool BrowseFiles(wstring* fileName) {
OPENFILENAMEW ofn;
//ZeroMemory(fileName,sizeof(fileName));
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = NULL;
ofn.lpstrFilter = _T("All\0*.*\0Text\0*.txt\0");
ofn.lpstrFile = LPWSTR((*fileName).c_str());
ofn.nMaxFile = MAX_PATH;
ofn.lpstrTitle = _T("Select a File!");
ofn.Flags = OFN_DONTADDTORECENT | OFN_FILEMUSTEXIST;
if (GetOpenFileNameW(&ofn)) {
return true;
} else {
return false;
}
}};
方法调用:
try {
wstring fileName;
if (OpenFileDialog::BrowseFiles(&fileName)) {
A(fileName); // erros here
} else {
A(_T("Failed"));
}
} catch (bad_alloc) {
A(L"Bad allocation");
}
答案 0 :(得分:3)
强制转换LPWSTR((*fileName).c_str())
暗示您做错了事。
字符串fileName
是 empty ,它没有分配任何内存。调用c_str()
将返回一个指针,该指针指向零字符的 常数 字符串。
所以有两个错误:您尝试将数据写入不存在的内存;即使这样做,它也将是恒定的,而且无论如何都无法修改。两者都导致undefined behavior。
您需要创建一个临时字符数组,其大小足以容纳可能的最长路径,然后在fileName
成功之后将GetOpenFileNameW
初始化为该字符串。