ImmDisableIME在xp下的bug

在将模块从服务迁移到界面进程后,在XP系统中出现死机现象。经QA反馈,问题可能与ImmDisableIME函数有关。通过搜索找到相关资料(http://www.devsuperpage.com/search/Articles.aspx?G=10&ArtID=30180),测试代码表明该函数在XP下存在bug,可能导致系统崩溃。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


以前模块在服务里面跑什么问题,这次移到界面进程,提测的时候QA反馈在XP下死机,然后自己单步到ImmDisableIME的时候出问题。

搜了下, http://www.devsuperpage.com/search/Articles.aspx?G=10&ArtID=30180


测试代码:

// adfs.cpp : Defines the entry point for the application.
//

#include "stdafx.h"

#include <windows.h>
#include <wchar.h>
#include <tchar.h>
#include <assert.h>
#include <process.h>
#include <stdio.h>

#pragma comment(lib, "imm32.lib")


#define EXTRA_THREAD_WINDOW_CLASS		L"C668F583-87AA-11d5-AE65-00904F30013B"

HANDLE	g_hEvent = 0;
HWND	g_hExtraWnd = 0;

LRESULT CALLBACK ExtraWndProc(HWND hWnd, UINT message, 
							  WPARAM wParam, LPARAM lParam)
{
	return DefWindowProc(hWnd, message, wParam, 
		lParam);
}

void __cdecl  ExtraThread(void* lParam)
{
	WNDCLASS wc;
	wchar_t szClassName[] = EXTRA_THREAD_WINDOW_CLASS;
	wc.style		= CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc	= (WNDPROC)ExtraWndProc;
	wc.cbClsExtra	= 0;
	wc.cbWndExtra	= 0;
	wc.hInstance	= GetModuleHandle( 0 );
	wc.hIcon		= NULL;
	wc.hCursor		= NULL;
	wc.hbrBackground= NULL;
	wc.lpszMenuName	= NULL;
	wc.lpszClassName= szClassName;

	if(!RegisterClass(&wc))
	{
		return;
	}

	g_hExtraWnd = CreateWindow(	szClassName, 

		L"", 

		WS_POPUP,

		-100000, 

		-100000, 

		0, 

		0, 

		NULL, 

		NULL, 

		GetModuleHandle( 0 ), 

		NULL);

	SetEvent( g_hEvent );

	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0)) 
	{
		DispatchMessage(&msg);
	}
}

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR lpCmdLine, int nCmdShow)
{
	_set_error_mode( _OUT_TO_MSGBOX );

	g_hEvent = CreateEvent( 0, FALSE, FALSE, 0 );
	if ( 0 == g_hEvent )
	{
		assert( !"Failed to create event;" );
		return 0;
	}

	ULONG  hThread;
	hThread = _beginthread( ExtraThread, 0, 0);
	if ( 0xFFFFFFFF == hThread)
	{
		assert( !"Failed to create thread" );
		return 0;
	}
	// wait for thread to create the window
	DWORD dwExtraThreadEvent = WaitForSingleObject( g_hEvent, 5000 );
	if (WAIT_FAILED == dwExtraThreadEvent)
	{
		assert( !"Failed to wait for event." );
		return 0;
	}
	else if (WAIT_TIMEOUT == dwExtraThreadEvent)
	{
		assert( !"Time out waiting for event." );
		return 0;
	}
	else if ( 0 != g_hExtraWnd )
	{
		printf( "The window was created successfully.");
	}

	if ( FALSE == ImmDisableIME( -1 ) )
	{
		printf ( "failed to disable IME, gle: %d", 			GetLastError() );
		assert( !"Failed to disable IME." );
	}

	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值