为什么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也是支持多线程的,我的程序为什么就跑不起来呢?请给点指。
...全文
309 6 打赏 收藏 转发到动态 举报
写回复
用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上出现了上述错误。
【源码免费下载链接】:https://renmaiwang.cn/s/j4y4z 在C语言中创建Windows窗口需要理解Windows API的基本概念和编程模型。Windows API是Microsoft Windows操作系统提供的函数库,它允许程序员创建图形用户界面(GUI)应用程序。以下是一个详细的步骤解析:1. **定义变量**: 在`WinMain`函数中,我们需要定义一些变量来存储窗口句柄(hwnd)、消息结构(MSG msg)以及窗口类(WNDCLASS wndclass)。这些变量在后续的窗口创建和消息处理中起着关键作用。2. **注册窗口类(RegisterClass)**: 窗口类定义了窗口的行为和外观。`WNDCLASS`结构包含了窗口类的属性,如窗口过程函数指针(lpfnWndProc)、图标、光标、背景刷等。在`RegisterClass`函数中,我们将这个结构作为参数传递,以注册我们的窗口类。如果注册失败,程序通常弹出一个错误消息框并退出。3. **创建窗口(CreateWindow)**: 使用`CreateWindow`函数创建实际的窗口。这个函数需要窗口类的名字(szAppName)、窗口标题("Hello")、窗口样式(WS_OVERLAPPEDWINDOW)以及初始位置和大小等信息。成功创建后,它返回新窗口的句柄。4. **显示和更新窗口**: `ShowWindow`函数用于设置窗口的初始显示状态,例如最大化、最小化或正常大小。`UpdateWindow`函数则确保窗口的内容被立即绘制,使得用户能看到窗口。5. **消息循环(Message Loop)**: 这是Windows GUI程序的核心部分。`GetMessage`函数用于从消息队列中获取待处理的消息,`TranslateMessage`将虚拟键消息转换为字符消息,而

16,551

社区成员

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

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

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