为什么RegisterClass会失败

hxh76ahei 2006-02-17 11:22:12
各位大佬好!请教如下问题。我的程序要Skype通讯,利用Skype发的SDK中的例子做了小许改动,在win2000和winxp上都没问问题,可程序在win98上却失败了。如下:
void main(void)
{
// create window class
// create dummy/hidden window for processing messages
// run message loop thread
// do application control until exit
// exit: send QUIT message to our own window
// wait until thred terminates
// destroy main window
// destroy window class
uiGlobal_MsgID_SkypeControlAPIAttach=RegisterWindowMessage("SkypeControlAPIAttach");
uiGlobal_MsgID_SkypeControlAPIDiscover=RegisterWindowMessage("SkypeControlAPIDiscover");
if( uiGlobal_MsgID_SkypeControlAPIAttach!=0 && uiGlobal_MsgID_SkypeControlAPIDiscover!=0 )
{
printf("STEP 1\n");
if( Initialize_CreateWindowClass() )
{
printf("STEP 2\n");
if( Initialize_CreateMainWindow() )
{
printf("STEP 3\n");
hGlobal_ThreadShutdownEvent=CreateEvent( NULL, TRUE, FALSE, NULL);
if( hGlobal_ThreadShutdownEvent!=NULL )
{
printf("STEP 4\n");
if( _beginthread( &Global_InputProcessingThread, 64*1024, NULL)!=(unsigned long)-1 )
{
printf("STEP 5\n");
Global_MessageLoop();
Global_Console_CancelReadRow();
WaitForSingleObject( hGlobal_ThreadShutdownEvent, INFINITE);
}
CloseHandle(hGlobal_ThreadShutdownEvent);
}
DeInitialize_DestroyMainWindow();
}
DeInitialize_DestroyWindowClass();
}
}
}
在第一步中bool Initialize_CreateWindowClass(void)
{
unsigned char *paucUUIDString;
RPC_STATUS lUUIDResult;
bool fReturnStatus;
UUID oUUID;

fReturnStatus=false;
lUUIDResult=UuidCreate(&oUUID);
hInit_ProcessHandle=(HINSTANCE)OpenProcess( PROCESS_DUP_HANDLE, FALSE, GetCurrentProcessId());
if( hInit_ProcessHandle!=NULL && (lUUIDResult==RPC_S_OK || lUUIDResult==RPC_S_UUID_LOCAL_ONLY) )
{
Printf("open process ok\n");
if( UuidToString( &oUUID, &paucUUIDString)==RPC_S_OK )
{
Printf("uuid converse ok\n");
WNDCLASS oWindowClass;

strcpy( acInit_WindowClassName, "Skype-API-Test-");
strcat( acInit_WindowClassName, (char *)paucUUIDString);

oWindowClass.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;
oWindowClass.lpfnWndProc=(WNDPROC)&SkypeAPITest_Windows_WindowProc;
oWindowClass.cbClsExtra=0;
oWindowClass.cbWndExtra=0;
oWindowClass.hInstance=hInit_ProcessHandle;
oWindowClass.hIcon=NULL;
oWindowClass.hCursor=NULL;
oWindowClass.hbrBackground=NULL;
oWindowClass.lpszMenuName=NULL;
oWindowClass.lpszClassName=acInit_WindowClassName;

if( RegisterClass(&oWindowClass)!=0 )
{
fReturnStatus=true;
}
else
{
printf("register wndclass failure!!!\n");
}



RpcStringFree(&paucUUIDString);
}
}
if( fReturnStatus==false )
CloseHandle(hInit_ProcessHandle),hInit_ProcessHandle=NULL;
return(fReturnStatus);
}
在win98上运行时输出:
step 1
open process ok
uuid converse ok
register wndClass failure
我把上面oWindowClass.hInstance=hInit_ProcessHandle;改为
oWindowClass.hInstance=NULL;后再输出就是:
step 1
open process ok
uuid converse ok
step 2
上面那个线程是要处理输入输出的,所以不能没有,win98也是支持多线程的,我的程序为什么就跑不起来呢?请给点指。
...全文
296 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangk 2006-02-17
  • 打赏
  • 举报
回复
晕,HINSTANCE不是内核对象,不能传openprocess打开得句柄,应该用GetModuleHandle(NULL)返回的值。
hxh76ahei 2006-02-17
  • 打赏
  • 举报
回复
to ydfivy:多谢大佬回复,可我看msdn上,上面的api好象98都支持的。那个注册过程也是很常见的呀。难道就是不能挂进去那个线程,可是在win32的application中都有wndclass.hInstance = hCurrentInst; 区别不就是这个hCurrentInst是糸统传进去的,而我那个用openprocess打开了一个吗?
一个傻冒 2006-02-17
  • 打赏
  • 举报
回复
98下.有些API可能不支持,或者不能使用的.
hxh76ahei 2006-02-17
  • 打赏
  • 举报
回复
to wangk;好心人,我按你说的又改了一下,在98下编还是失败了。再说一次同样方法在win2000和winxp上是没有问题的。错在哪 儿了?
wangk 2006-02-17
  • 打赏
  • 举报
回复
GetModuleHandle(NULL)返回的是HMODULE,也要强制转HINSTANCE。
hxh76ahei 2006-02-17
  • 打赏
  • 举报
回复
to wangk:多谢有两颗红星的大佬,在上面的程序中hInit_ProcessHandle=(HINSTANCE)OpenProcess( PROCESS_DUP_HANDLE, FALSE, GetCurrentProcessId());打开了一个存在的线程共享它的句柄并进行HINSTANCE强制转换,在编绎中并没有错,而且有open process ok的输出,同时我用你的GetModuleHandle(NULL)同样失败了。这个程序是一个console模式的,编绎生成的程序在win2000和winxp上都有正确结果。但在98上出现了上述错误。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧