Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows server 2008 r2 C应用程序使用GetOpenFileName崩溃。DEP阻止了坠机_Windows Server 2008 R2_C_Winapi - Fatal编程技术网

Windows server 2008 r2 C应用程序使用GetOpenFileName崩溃。DEP阻止了坠机

Windows server 2008 r2 C应用程序使用GetOpenFileName崩溃。DEP阻止了坠机,windows-server-2008-r2,c,winapi,Windows Server 2008 R2,C,Winapi,我们有一个C应用程序,它使用GetOpenFileName公共对话框让用户选择一个文件。我们在Windows2008R2上发生了崩溃。我发现如果我们在应用程序上设置DEP异常,崩溃就会停止 然而,我不知道我们做错了什么,也不知道我们能做些什么来阻止撞车。我把我们的代码放在下面 typedef struct { OPENFILENAME ofn; COUNT nInternal; COUNT nExternal; char

我们有一个C应用程序,它使用GetOpenFileName公共对话框让用户选择一个文件。我们在Windows2008R2上发生了崩溃。我发现如果我们在应用程序上设置DEP异常,崩溃就会停止

然而,我不知道我们做错了什么,也不知道我们能做些什么来阻止撞车。我把我们的代码放在下面

typedef struct {
    OPENFILENAME    ofn;
    COUNT       nInternal;
    COUNT       nExternal;
    char        szDirName[_MAX_DIR];
    char        szFile[_MAX_PATH];
    char        szFileTitle[_MAX_PATH];
    char        szFilter[128];
} OPENFILENAMEINFO;

typedef OPENFILENAMEINFO FAR *LPOPENFILENAMEINFO;


LPOPENFILENAMEINFO RequestFileNameEx(HWND hDlg, LPSTR lpExt, BOOL bSave, LPSTR lpInit)
{

    LPOPENFILENAMEINFO lpFileNameInfo;
    int i;
    DWORD   dwError;
    DWORD   dwSize;
    LPSTR   lpDir;
    LPSTR   lpDrive;

    lpFileNameInfo = (LPOPENFILENAMEINFO)mballc(1,sizeof(OPENFILENAMEINFO));
    strcpy(lpFileNameInfo->szFilter,lpExt);

    for (i=0; lpFileNameInfo->szFilter[i] != '\0'; i++) {
        if (lpFileNameInfo->szFilter[i] == '|')
            lpFileNameInfo->szFilter[i] = '\0';
    }

    memset(&lpFileNameInfo->ofn, 0, sizeof(OPENFILENAME));

    lpFileNameInfo->ofn.lStructSize = sizeof(OPENFILENAME);
    lpFileNameInfo->ofn.hwndOwner       = hDlg;
    lpFileNameInfo->ofn.lpstrFilter = lpFileNameInfo->szFilter;
    lpFileNameInfo->ofn.nFilterIndex    = 1;
    lpFileNameInfo->ofn.lpstrFile       = lpFileNameInfo->szFile;
    lpFileNameInfo->ofn.nMaxFile        = sizeof(lpFileNameInfo->szFile);
    lpFileNameInfo->ofn.lpstrFileTitle  = lpFileNameInfo->szFileTitle;
    lpFileNameInfo->ofn.nMaxFileTitle   = sizeof(lpFileNameInfo->szFileTitle);

    lpFileNameInfo->ofn.lpstrInitialDir = _getcwd(lpFileNameInfo->szDirName, _MAX_DIR);

    if (bSave) {
        lpFileNameInfo->ofn.Flags           = OFN_SHOWHELP | OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_NOCHANGEDIR;
        dwError = GetSaveFileName(&lpFileNameInfo->ofn);
    } else {
        lpFileNameInfo->ofn.Flags           = OFN_SHOWHELP | OFN_PATHMUSTEXIST | (bDir==FALSE?OFN_FILEMUSTEXIST:0) | OFN_NOCHANGEDIR;
        dwError = GetOpenFileName(&lpFileNameInfo->ofn);
    }

    if (!dwError) {
        dwError = CommDlgExtendedError();
        if (dwError)
            ResourceHandleError(GETOPENFAIL, dwError);
        mbfree(lpFileNameInfo);
        return(NULL);
    }


    return(lpFileNameInfo);
}
崩溃转储堆栈跟踪看起来像

0023:73E61FFF (0x080D7974 0x080D7970 0x078B62F0 0x00000000) msxml6.dll
0023:73E68165 (0x080D7970 0x080D78F0 0x078B62F0 0x080D78F0) msxml6.dll, DllCanUnloadNow()+22084 byte(s)
0023:73E67D08 (0x078B62F0 0x080D7970 0x00000000 0x080D78F0) msxml6.dll, DllCanUnloadNow()+20967 byte(s)
0023:73E6827A (0x080D78F0 0x080D7970 0x080D7950 0x59E489BA) msxml6.dll, DllCanUnloadNow()+22361 byte(s)
0023:73E68241 (0x080D7970 0x080D7950 0x59E489BA 0x00000000) msxml6.dll, DllCanUnloadNow()+22304 byte(s)
0023:73E69DDF (0x00000000 0x080D7950 0x00000000 0x0762FAE0) msxml6.dll, DllCanUnloadNow()+29374 byte(s)
0023:73E6BF9F (0x080D7970 0x080D7950 0x71932915 0x078B5E90) msxml6.dll, DllGetClassObject()+5125 byte(s)
0023:73E6BF83 (0x73E81B38 0x080D39C0 0x080D39C0 0x080D3980) msxml6.dll, DllGetClassObject()+5097 byte(s)
0023:73E6C318 (0x71932881 0x06148CB8 0x06148CB8 0x00000000) msxml6.dll, DllGetClassObject()+6014 byte(s)
0023:73E6CD18 (0x720B35A0 0x0762FBD8 0x06148CB8 0x0762FD68) msxml6.dll, DllGetClassObject()+8574 byte(s)
0023:73E78671 (0x720B35A0 0x0762FBD8 0x0762FD68 0x00000000) msxml6.dll, DllGetClassObject()+56023 byte(s)
0023:73E6AAE5 (0x73E6AC28 0x00000000 0x720B35A0 0x0762FBD8) msxml6.dll, DllCanUnloadNow()+32708 byte(s)
0023:74B0A0E1 (0x00000000 0x00000000 0x00000000 0x00000001) ole32.dll, CoCreateInstanceEx()+0915 byte(s)
0023:74B09FA1 (0x720B3614 0x00000000 0x00000017 0x00000000) ole32.dll, CoCreateInstanceEx()+0595 byte(s)
0023:74B09E25 (0x720B3614 0x00000000 0x00000017 0x00000000) ole32.dll, CoCreateInstanceEx()+0215 byte(s)
0023:74B09D86 (0x720B3614 0x00000000 0x00000017 0x00000000) ole32.dll, CoCreateInstanceEx()+0056 byte(s)
0023:74B09D3F (0x720B3614 0x00000000 0x00000017 0x720B35A0) ole32.dll, CoCreateInstance()+0052 byte(s)
0023:720B352B (0x0553A7C0 0x00000000 0x0070E2DC 0x0070E288) FunDisc.dll
0023:720B9470 (0x0553A7C0 0x00000000 0x00000001 0x00000001) FunDisc.dll, DllGetClassObject()+21871 byte(s)
0023:720C3B69 (0x00000001 0x0070E288 0x8007000E 0x00000000) FunDisc.dll, DllUnregisterServer()+20504 byte(s)
0023:720B75AA (0x73751590 0x00000000 0x00000001 0x00000000) FunDisc.dll, DllGetClassObject()+13993 byte(s)
0023:720B1CE9 (0x73751590 0x00000000 0x00000001 0x055874F8) FunDisc.dll
0023:720B1C39 (0x00709310 0x73751590 0x00000000 0x00000001) FunDisc.dll
0023:73752F84 (0x055E2F28 0x00709310 0x73751590 0x00000000) NetworkItemFactory.dll
0023:737530A5 (0x055E2F28 0x0762FF88 0x763643C0 0x055E2F28) NetworkItemFactory.dll
0023:73753144 (0x055E2F28 0x00000000 0x00000000 0x03EDFB9C) NetworkItemFactory.dll
0023:763643C0 (0x03EDFB9C 0x0762FFD4 0x77029EF2 0x03EDFB9C) SHLWAPI.dll, IUnknown_QueryService()+0346 byte(s)
0023:74C9339A (0x03EDFB9C 0x13BB74FB 0x00000000 0x00000000) kernel32.dll, BaseThreadInitThunk()+0018 byte(s)
0023:77029EF2 (0x763642ED 0x03EDFB9C 0xFFFFFFFF 0x770B736F) ntdll.dll, RtlInitializeExceptionChain()+0099 byte(s)
0023:77029EC5 (0x00000000 0x00000000 0x00000000 0x00000000) ntdll.dll, RtlInitializeExceptionChain()+0054 byte(s)

我也遇到了同样的问题,并通过Synastry找到了一个可能的解决方案

我们所有遇到这个问题的人在函数“coninitialize”中都有一个调用堆栈。当COM的工作线程结束时,将自动调用此函数。此工作线程不是由用户直接创建的,而是在调用使用COM库的某个函数时创建的。我和Wagscalion通常称函数为“GetOpenFileName”。我猜GSansoucie也调用了一些COM自动化函数

结束工作线程并被称为“ConInitialize”是COM库的合法和正常操作。这不是原因。我们遇到的异常是在COM服务器仍在使用时未初始化COM服务器造成的。但我们的(或至少我的)代码也是合法的和适当的,除了一件事。我从未在代码中调用过“CoInitialize”或“CoInitializeX”函数

COM库有一个内部计数(类似于引用计数器),它通过调用CoInitialize或CoInitializeX递增,通过调用ConInitialize递减。但我没有调用任何初始化函数。虽然我没有调用它,但GetOpenFileName函数在GetOpenFileName的实现中为其工作线程调用它。函数返回后,工作线程会等待另一个COM作业一段时间。这就是为什么当GetOpenFileName函数返回时,异常不会立即发生。但是工作线程决定自己结束,他们调用ConInitialize,现在COM库服务器的内部计数变为0,ConInitialize从内存中释放所有资源

但在GetOpenFileName函数返回后,一些资源应该保留在内存中(我不能确定这一点,但如果这个假设不成立,我们将永远不会遇到异常)。为了保持它们不被释放,我们需要在程序初始化时调用CoInitialize或coInitializex(MSDN建议稍后使用)。我们还需要在程序完成前调用ConInitialize

简而言之,我们需要在程序开始时调用“CoInitialize”或“CoInitializeX”,在程序结束时调用“ConInitialize”。但MSDN没有对GetOpenFileName或使用COM库的任何其他函数的这一点进行说明:-(

在我的例子中,通过调用初始化器和取消初始化器,问题消失了,现在一切正常。请查看并将其应用到您的代码中。如果您知道导致此异常的其他原因,请也告诉我们。:-)

谢谢你的阅读

对我自己来说,这不是解决办法,而是一个可以考虑的提示。我在我的多线程应用程序中使用了CoInitialize,该应用程序使用Conit_APARTMENTTHREADED在内部调用CoInitializeX。
我现在将调用从CoInitialize(NULL)更改为coinitializex(NULL,COINIT_多线程),我的问题似乎消失了。

我遇到了同样的问题,并通过Synastry在上找到了可能的解决方案

我们所有遇到这个问题的人在函数“coninitialize”中都有一个调用堆栈。当COM的工作线程结束时,将自动调用此函数。此工作线程不是由用户直接创建的,而是在调用使用COM库的某个函数时创建的。我和Wagscalion通常称函数为“GetOpenFileName”。我猜GSansoucie也调用了一些COM自动化函数

结束工作线程并被称为“ConInitialize”是COM库的合法和正常操作。这不是原因。我们遇到的异常是在COM服务器仍在使用时未初始化COM服务器造成的。但我们的(或至少我的)代码也是合法的和适当的,除了一件事。我从未在代码中调用过“CoInitialize”或“CoInitializeX”函数

COM库有一个内部计数(类似于引用计数器),它通过调用CoInitialize或CoInitializeX递增,通过调用ConInitialize递减。但我没有调用任何初始化函数。虽然我没有调用它,但GetOpenFileName函数在GetOpenFileName的实现中为其工作线程调用它。函数返回后,工作线程会等待另一个COM作业一段时间。这就是为什么当GetOpenFileName函数返回时,异常不会立即发生。但是工作线程决定自己结束,他们调用ConInitialize,现在COM库服务器的内部计数变为0,ConInitialize从内存中释放所有资源

但在GetOpenFileName函数返回后,一些资源应该保留在内存中(我不能确定这一点,但如果这个假设不成立,我们将永远不会遇到异常)。为了保持它们不被释放,我们需要在程序初始化时调用CoInitialize或coInitializex(MSDN建议稍后使用)。我们还需要在程序完成前调用ConInitialize

简而言之,我们需要在程序开始时调用“CoInitialize”或“CoInitializeX”,在程序结束时调用“ConInitialize”。但MSDN没有对GetOpenFileName或使用COM库的任何其他函数的这一点进行说明:-(

在我的例子中,通过调用初始化器和取消初始化器,问题消失了,现在一切正常。请查看并将其应用到您的代码中。如果您知道导致此异常的其他原因,请也告诉我们。:-)

谢谢你的阅读

对我自己来说,这不是解决办法,而是一个可以考虑的提示。我在m中使用了CoInitialize