關於TeeChart8.ocx控件的註冊問題

Doug_K 2012-01-12 04:41:30
各位好,目前有個問題已經四天一直沒解決出來,本人極少於MFC平台開發,現在在做的一個UI中,由於調用到TeeChart8.ocx這個控件,大家都知道第三方控件要在Winows平台上跑都應該註冊的,我想讓我的程序能在運行時就自動把該控件在系統上註冊完成,而網上搜到過的方法都試過了,是可行,但是卻無法在我這種情況上正常註冊,因為原本該控件就出現在Dialog上的.現在請問各位有沒辦法,讓我的程序在運行時便能在沒註冊該控件的電腦上把附帶的TeeChart8.ocx註冊到註冊表中,然後成功顯示對話框.
...全文
560 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Doug_K 2012-06-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

怎么是繁体的啊》
[/Quote]因為公司內部通訊都是用繁體的
pcw515sina 2012-06-06
  • 打赏
  • 举报
回复
怎么是繁体的啊》
Doug_K 2012-01-13
  • 打赏
  • 举报
回复
其實這貼可以結了...只是還要處理一個每次運行註冊代碼時先檢查下系統註冊表裡是否已經有存在的CLSID...有的話就可以免去再註冊的代碼了...
Doug_K 2012-01-13
  • 打赏
  • 举报
回复
好吧,我的方法是在APP中要啟動Dialog之前,先把控件註冊的代碼段運行.這樣就沒問題了.
代碼如下:
char strAddr[300];
char strCMD[400] = "regsvr32.exe \"";

//ActiveX Com
GetCurrentDirectory(150, strAddr);
strcat( strAddr, "\\TeeChart8.ocx\"");
strcat( strCMD, strAddr);
WinExec( _T(strCMD), SW_MAXIMIZE );
Doug_K 2012-01-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 gis_wudi 的回复:]

HKEY_CLASSES_ROOT\CLSID键中查找ClassID或在HKEY_CLASSES_ROOT键中查找ProgID,如果找到就表明已经注册了。
还有要注意版本问题,可能是新旧版本用的是同一个ClassID.在注册表HKEY_CLASSES_ROOT\CLSID键中查找HKEY_CLASSES_ROOT\CLSID\{.....}\InprocServer32默认值是这个组……
[/Quote]
另...
以下是我的代碼段

HKEY hKey;
LPCTSTR data_Set= "SOFTWARE\\Classes\\CLSID\\{BDEB0088-66F9-4A55-ABD2-0BF8DEEC1196}\\InprocServer32\\";
long ret = ::RegOpenKeyEx( HKEY_LOCAL_MACHINE, data_Set, 0, 0, &hKey);

if(ret == 0x02)//Register didn't have the com clsid
{
char strAddr[300];
char strCMD[400] = "regsvr32.exe \"";

//ActiveX Com
GetCurrentDirectory(150, strAddr);
strcat( strAddr, "\\TeeChart8.ocx\"");
strcat( strCMD, strAddr);
WinExec( _T(strCMD), SW_MAXIMIZE );
}

我調用的是RegOpenKeyEx這個函數,查詢MSDN時得到的返回是這樣描述的:

Return Values
ERROR_SUCCESS indicates success. A nonzero error code defined in Winerror.h indicates failure. To get a generic description of the error, call FormatMessage with the FORMAT_MESSAGE_FROM_SYSTEM flag set. The message resource is optional; therefore, if you call FormatMessage it could fail.
==================================================================
而我通過手動的regsvr32 dir..\TeeChart8.ocx來註冊後,看到返回的值是0x05.而當我也手動用/u參數來刪除註冊表裡的信息後,看到ret的返回值卻是0x02.因為之前用MSDN的ERROR_SUCCESS來作判斷條件時無效,所以這裡才會修改為0x02來區分是否被註冊過.這個讓我有點疑惑.
Doug_K 2012-01-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 gis_wudi 的回复:]

HKEY_CLASSES_ROOT\CLSID键中查找ClassID或在HKEY_CLASSES_ROOT键中查找ProgID,如果找到就表明已经注册了。
还有要注意版本问题,可能是新旧版本用的是同一个ClassID.在注册表HKEY_CLASSES_ROOT\CLSID键中查找HKEY_CLASSES_ROOT\CLSID\{.....}\InprocServer32默认值是这个组……
[/Quote]
嗯,確實,目前處理的方法便是你這裡介紹的.其它的處理大部分還是寫到了博客中,以便以後遇到相同問題時再返回來看看筆記嘿.
GIS_wudi 2012-01-13
  • 打赏
  • 举报
回复
HKEY_CLASSES_ROOT\CLSID键中查找ClassID或在HKEY_CLASSES_ROOT键中查找ProgID,如果找到就表明已经注册了。
还有要注意版本问题,可能是新旧版本用的是同一个ClassID.在注册表HKEY_CLASSES_ROOT\CLSID键中查找HKEY_CLASSES_ROOT\CLSID\{.....}\InprocServer32默认值是这个组件文件路径的CLSID就是你要找的。
GIS_wudi 2012-01-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 amwjatyvh 的回复:]
其實這貼可以結了...只是還要處理一個每次運行註冊代碼時先檢查下系統註冊表裡是否已經有存在的CLSID...有的話就可以免去再註冊的代碼了...
[/Quote]
这貌似也有解决方案
查找注册表,CLSID的犍值会有改变。根据这个键值的改变就可以判断是不是某个控件或dll是否已经注册过了
GIS_wudi 2012-01-12
  • 打赏
  • 举报
回复
我提供一种解决方案,以供其他人参考
WinExec("regsvr32 **.ocx",SW_HIDE);
system("regsvr32 **.ocx");
win7系统注册控件需要管理员身份
GIS_wudi 2012-01-12
  • 打赏
  • 举报
回复
那就把经验分享出来
Doug_K 2012-01-12
  • 打赏
  • 举报
回复
總算找到了.不用麻煩了.

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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