none
将原来在win32选项下编译的项目添加x64选项,并编译通过,程序启动失败,报0xc0000142错误。 RRS feed

  • 问题

  • vc版本:2005

    系统:windows 2008 r2

    大家好,

    我遇到这样一个问题,就是在原有的vc项目上添加x64平台编译选项,添加没有问题,也编译通过了,但是运行程序失败,运行后立刻弹出一个警告对话框“The application was unable to start correctly (0xc0000142). Click OK to close the application.”。

    在网上看了,说可以用dependency walker检查依赖性,我检查了一下,发现IEFRAME.DLL有问题,在dependency walker中双击它后弹出对话框“Errors were detected when processing "c:\windows\system32\IEFRAME.DLL". See the log window for details.”。但是我不知怎么解决这个问题。

    请大家帮忙,问题比较紧急。谢谢先。

    2015年4月7日 12:21

全部回复

  • 弹出的对话让你看一下log window,有什么有用的信息吗?

    你的windows 2008 r2是多少位的? 有没有可能你的项目用到了一下32bit的lib或com组件,而用到的lib或com组件可能依赖于ieframe.dll,可能你项目的依赖的lib和com组件都重新编译成64位的。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年4月8日 6:50
  •  经过逐渐减少代码的方法排查到,是因为调用的一个dll中的DllMain方法导致的,不知道64位下DllMain应该怎么写,WINAPI肯定是有问题的吧,不是说__stdcall在64位下不行吗?我的出问题的DllMain()如下,请帮忙看看有没有什么问题:

    BOOL DllMain(HANDLE hDLL, DWORD dwReason, LPVOID lpReserved)
    {
    	switch (dwReason) 
    	{
    	case DLL_PROCESS_ATTACH:
    		{
    			LoadIniSettings();
    
    			if(trace_debug)
    				OutputDebugString("DLL_PROCESS_ATTACH\n");
    
    			::DisableThreadLibraryCalls(static_cast<HMODULE>(hDLL));
    
    			SECURITY_ATTRIBUTES seqatt;
    			SECURITY_DESCRIPTOR SD;
    
    			memset(&seqatt,0,sizeof(SECURITY_ATTRIBUTES));
    
    			if (!InitializeSecurityDescriptor(&SD, SECURITY_DESCRIPTOR_REVISION)|| !SetSecurityDescriptorDacl(&SD, TRUE, (PACL) NULL, FALSE))
    				return FALSE;
    			seqatt.nLength = sizeof(SECURITY_ATTRIBUTES);
    			seqatt.lpSecurityDescriptor = &SD;
    			seqatt.bInheritHandle = FALSE;    
    			hMutex = CreateMutex(&seqatt, FALSE, MUTEXNAME);
    
    			if (!hMutex)
    				return FALSE;          
    
    			BOOL create = FALSE;
    
    			if(!DoMapFile(&create))
    				return FALSE;
    
    			MapUsedInfo *map_used_info = (MapUsedInfo*)pmem;
    
    			if(create) 
    			{
    
    			}
    		}
    		break;
    
    	case DLL_THREAD_ATTACH:
    		if(trace_debug)
    			OutputDebugString("DLL_THREAD_ATTACH\n");
    		break;
    
    	case DLL_THREAD_DETACH:
    		if(trace_debug)
    			OutputDebugString("DLL_THREAD_DETACH\n");
    		break;
    
    	case DLL_PROCESS_DETACH:
    		if(trace_debug)
    			OutputDebugString("DLL_PROCESS_DETACH\n");
    
    		CloseLockThread();
    		CloseMapFile();
    
    		if(hMutex) 
    			CloseHandle(hMutex); hMutex=0;
    
    		break;
    	}
    	return TRUE;
    }

    2015年4月9日 11:42
  • 不好意思,后来发现是由于下面的代码‘hmem’总是返回null导致的,但不知道什么原因,你能帮我吗?

    #define MAPFILENAMESIZE 256
    #define MAP_NUM_MAX 256
    #define LOCK_NUM_MAX 16
    #define MUTEXNAME "nvsmapcommonmutex"
    #define LOCKNAME "nvsmaplockevent"
    
    typedef struct {
      HANDLE h;
      DWORD  id;
    } MapLock;
    
    typedef struct {
      char mapfilename[MAPFILENAMESIZE];
      int  client_ro;
      BOOL client_rw;
      int  client_lock;
      MapLock lock[LOCK_NUM_MAX];
    } MapUsedInfo;
    
    #define DEBBUFSIZE (sizeof(MapUsedInfo)*MAP_NUM_MAX)
    #define SHAREDNAME "nvsmapcommondata"
    
    HANDLE hmem = NULL;
    
    SECURITY_ATTRIBUTES seqatt;
    SECURITY_DESCRIPTOR SD;
    
    memset(&seqatt,0,sizeof(SECURITY_ATTRIBUTES));
    if (!InitializeSecurityDescriptor(&SD, SECURITY_DESCRIPTOR_REVISION)||!SetSecurityDescriptorDacl(&SD, TRUE, (PACL) NULL, FALSE))
        return FALSE;
    
    seqatt.nLength=sizeof(SECURITY_ATTRIBUTES);
    seqatt.lpSecurityDescriptor =&SD;
    seqatt.bInheritHandle = FALSE;  
    
    hmem = CreateFileMapping((HANDLE)0xFFFFFFFF,&seqatt,PAGE_READWRITE,0,DEBBUFSIZE+1,SHAREDNAME);

    2015年4月9日 12:04