如何防止重复注册类?

Sandrer 2008-06-10 11:19:22
我用RegisterClassEx函数注册了一个类(封装在一个标准DLL里,制作成一个输出函数(API))。
第一个程序调用了该函数之后,提示类注册成功。
但是当我第二个程序再调用这个函数后,还是提示注册成功。

有什么办法检测某个类是否已经注册(我尝试过用GetClassInfoEx和直接使用该类来创建窗体,效果都不理想)?


C++函数代码:

  1. DWORD WINAPI InitTMClass(HINSTANCE hInstance, DWORD flags)
  2. {
  3. hAppInst = hInstance;
  4. HWND tmpWnd = NULL;
  5. DWORD lResult = NULL;

  6. if((flags & INIT_COMMON) == INIT_COMMON) ::InitCommonControls();

  7. WNDCLASSEX wcex;
  8. wcex.cbSize = sizeof(WNDCLASSEX);

  9. if((flags & INIT_MAIN) == INIT_MAIN)
  10. {
  11. tmpWnd = ::CreateWindowEx(0, szMainClassname, NULL, WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInst, NULL);
  12. if(!tmpWnd)
  13. {
  14. wcex.style = CS_HREDRAW | CS_VREDRAW;
  15. wcex.lpfnWndProc = MainWndProc;
  16. wcex.cbClsExtra = 0;
  17. wcex.cbWndExtra = 0;
  18. //wcex.hInstance = hAppInst;
  19. wcex.hIcon = ::LoadIcon(hInst, MAKEINTRESOURCE(IDI_MAINICON));
  20. wcex.hCursor = ::LoadCursor(hInst, MAKEINTRESOURCE(IDC_MAINCUR));
  21. wcex.lpszMenuName = NULL;
  22. wcex.lpszClassName = szMainClassname;
  23. wcex.hbrBackground = (HBRUSH)COLOR_3DSHADOW;
  24. if(!::RegisterClassEx(&wcex))
  25. lResult = INIT_MAIN_FAILED;
  26. else
  27. lResult = INIT_MAIN_FINSH;
  28. }else{
  29. ::DestroyWindow(tmpWnd);
  30. lResult = INIT_MAIN_FINSH;
  31. }
  32. }

  33. if((flags & INIT_SLIDER) == INIT_SLIDER)
  34. {
  35. wcex.cbSize = sizeof(WNDCLASSEX);
  36. if(!::GetClassInfoEx(NULL, szSliderClassname, &wcex))
  37. {
  38. wcex.style = NULL;
  39. wcex.lpfnWndProc = SliderProc;
  40. wcex.cbClsExtra = 0;
  41. wcex.cbWndExtra = 0;
  42. wcex.hInstance = hAppInst;
  43. wcex.hIcon = NULL;
  44. wcex.hCursor = ::LoadCursor(hInst, MAKEINTRESOURCE(IDC_SLIDERCUR));
  45. wcex.lpszMenuName = NULL;
  46. wcex.lpszClassName = szSliderClassname;
  47. wcex.hbrBackground = (HBRUSH)COLOR_3DSHADOW;
  48. if(!::RegisterClassEx(&wcex))
  49. lResult = (lResult ^ INIT_SLIDER_FAILED) | INIT_SLIDER_FAILED;
  50. else
  51. lResult = (lResult ^ INIT_SLIDER_FINSH) | INIT_SLIDER_FINSH;
  52. }else
  53. lResult = (lResult ^ INIT_SLIDER_FINSH) | INIT_SLIDER_FINSH;
  54. }

  55. return lResult;
  56. }




因为这个DLL是制作给VB调用的,所以顺便来VB版问问看有没有人知道。
反正方法行得通就OK了,我自己会转成C++代码,谢谢~~~~~
...全文
给本帖投票
195 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenhui530 2008-06-11
  • 打赏
  • 举报
回复
DLLMAIN
Sandrer 2008-06-11
  • 打赏
  • 举报
回复
我开头也想用这方法,但就是不知道放什么地方!

是放在DllMain函数里好呢,还是放在我上面的InitTMClass函数里好?
Sandrer 2008-06-11
  • 打赏
  • 举报
回复
其实我的原意是,无论有多少个程序调用这个函数,都只把类注册一次而不影响运行!

请问除互斥体外还有没有别的办法呢?再多等一天,如果没有就12号早上结帖~~~~~~~~~~~~~~~~~~

让各位多等一天啦~~~~~~~
CathySun118 2008-06-11
  • 打赏
  • 举报
回复
DLLMAIN中增加互斥
Sandrer 2008-06-11
  • 打赏
  • 举报
回复
因为跟VB有关,这个DLL是做给VB程序调用的~
再说了,我提问的问题,不论哪个语言都有用的嘛~~~


顺便UP!
现在还是人类 2008-06-11
  • 打赏
  • 举报
回复
晕,VB版来讨论VC
chenhui530 2008-06-10
  • 打赏
  • 举报
回复
建立互斥对象即可

1,488

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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

手机看
关注公众号

关注公众号

客服 返回
顶部