CreateFile崩溃... GetLastError返回4235960

时间:2014-02-13 09:36:42

标签: c winapi

正如标题所说,我遇到了CreateFile()的问题,这对我来说没有意义。我承认自从我在Windows上进行任何编程以来已有十多年了,所以也许我只是错过了一些简单的...

int makeButtons(HWND main_window) { 

HRESULT ec;
TCHAR config_file[MAX_PATH];
LPSTR config_folder;
HANDLE config_file_handle;
int i;

ec = SHGetFolderPath(NULL,CSIDL_LOCAL_APPDATA,NULL,SHGFP_TYPE_DEFAULT,config_file);
if (ec != S_OK) {
    DisplayError((LPTSTR)"ec = SHGetKnownFolderPath(FOLDERID_Profile,0,NULL,config_file)", ec);
    return -1;
}

i = (lstrlen(config_file)+1) * sizeof(TCHAR);
config_folder = (LPSTR)LocalAlloc(LMEM_ZEROINIT,i);
StringCbCat(config_folder,i,config_file);

StringCbCat(config_file,MAX_PATH,"\\Flipperbuilt\\Sidebar\\config.data");
MessageBox(NULL,config_file,"here",MB_OK);
config_file_handle = CreateFile(config_file,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
if (config_file_handle == INVALID_HANDLE_VALUE) {
    MessageBox(NULL,"here","yep",MB_OK);
    DisplayError((LPTSTR)"CreateFile(config_file,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)",GetLastError());
}
else {
    CloseHandle(config_file_handle);
}

LocalFree(config_folder);  
return 0;

}

所有MessageBox()调用现在只是调试内容...试图弄清楚崩溃的位置。 DisplayError()调用是另一个函数,它格式化并显示来自GetLastError()的错误代码,我知道它确实可以正常工作。如果我在DisplayError()之前省略了MessageBox(),它会在我从GetLastError()获取4325960之前使用MessageBox()调用崩溃。

有什么想法吗?!?

谢谢!

1 个答案:

答案 0 :(得分:0)

我感觉非常愚蠢...正如Michael Walz所说我的问题在于DisplayError例程。我在调用StringCchPrintf()时在列表中有一个额外的变量,它没有任何与之关联的格式化(%s)信息(因为它最后工作并且没有实现它,所以我对其进行了更改) !!)再次感谢大家的意见。

int makeButtons(HWND main_window) { 

HRESULT ec;
TCHAR config_file[MAX_PATH];
LPTSTR config_folder;
HANDLE config_file_handle;
int i;

ec = SHGetFolderPath(NULL,CSIDL_LOCAL_APPDATA,NULL,SHGFP_TYPE_DEFAULT,config_file);
if (ec != S_OK) {
    DisplayError("ec = SHGetKnownFolderPath(FOLDERID_Profile,0,NULL,config_file)", ec);
    return -1;
}

i = (lstrlen(config_file)+1) * sizeof(TCHAR);
config_folder = (LPSTR)LocalAlloc(LMEM_ZEROINIT,i);
StringCbCat(config_folder,i,config_file);

StringCbCat(config_file,MAX_PATH,"\\Flipperbuilt\\Sidebar\\config.data");
config_file_handle = CreateFile(config_file,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
if (config_file_handle == INVALID_HANDLE_VALUE) {
    DisplayError("CreateFile(config_file,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)",GetLastError());
}
else {
    CloseHandle(config_file_handle);
}

LocalFree(config_folder);  
return 0;
}

void DisplayError(const char* lpszFunction, DWORD dw) { 
LPVOID lpMsgBuf;
LPVOID lpDisplayBuf;
LPTSTR error_string_in = TEXT((LPSTR)lpszFunction);
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL );
lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT,(lstrlen(error_string_in)+(lstrlen((LPCTSTR)lpMsgBuf) + 10)) * sizeof(TCHAR));
StringCchPrintf((LPTSTR)lpDisplayBuf,LocalSize(lpDisplayBuf) / sizeof(TCHAR),TEXT("%d: %s"),dw, lpMsgBuf);
MessageBox(NULL, (LPCTSTR)lpDisplayBuf, error_string_in, MB_OK);

LocalFree(lpMsgBuf);
LocalFree(lpDisplayBuf);
return;
}

我还有什么遗漏或需要学习的东西?!?正如我之前所说,我确实有一个体面的理解......只是没有掌握细节。

相关问题