WIN 10注册OCX组件 ——模块“E:\***.ocx”已加载,但对 DllRegisterServer 的调用失败,错误代码为 0x80004005

展开阅读全文

OCX加载但对dllregisterserver调用失败错误代码0X80040200

06-23

写了个静态库供ocx调用rn[code=c]rnint DecyptFle(wchar_t *lpFileName,wchar_t **strUserID,wchar_t **moduleid,wchar_t **devicename)rnrn// if(access((const char *)lpFileName,0) == -1) // [6/23/2014 ZhangcH]rn// rn// return -1; //文件不存在rn// rn memset(hexCiphertextAnyLength,0,16384);rn memset(bitsCiphertextAnyLength,0,32768);rn memset(szCiphertextData,0,8192);rn memset(readRes,0,32768);rn return 0;rn// CFile fileRead;rn// if(!fileRead.Open((LPCTSTR)lpFileName,CFile::modeRead))rn// rn// // AfxMessageBox(_T("授权文件路径不正确!"));rn// return -2; //文件存在 但是打开失败rn// rn// fileRead.Read(readRes,fileRead.GetLength());rn// fileRead.Close();rn// rn// yxyDES.InitializeKey("wintone",0);rn// yxyDES.InitializeKey("thwintoneinfo",1);rn// rn// yxyDES.DecryptAnyLength(szCiphertextData,ConvertOtherFormat2Ciphertext(readRes),0);rn// yxyDES.EncryptAnyLength(yxyDES.GetPlaintextAnyLength(),strlen(yxyDES.GetPlaintextAnyLength()),1);rn// yxyDES.DecryptAnyLength(yxyDES.GetCiphertextAnyLength(),strlen(yxyDES.GetCiphertextAnyLength()),0);rn// rn// lszRes = yxyDES.GetPlaintextAnyLength();rn// rn// replaceDcy(lszRes,'#','\n');rn// replaceDcy(lszRes,'@','\r');rn// replaceDcy(lszRes,'!','\0');rn// size_t len = strlen(lszRes) + 1;rn// size_t converted = 0;rn// wchar_t *wStrRes = NULL;rn// wStrRes=(wchar_t*)malloc(len*sizeof(wchar_t));rn// // mbstowcs_s(&converted, wStrRes, len, lszRes, _TRUNCATE);rn// mbstowcs(wStrRes, lszRes, len);rn// rn// int nPos = 0;rn// int times = 0;rn// while(wStrRes[nPos] != L'\0')rn// rn// if (wStrRes[nPos] == L'=')rn// rn// times++;rn// switch(times)rn// rn// case 1:rn// rn// int nDest = 0;rn// int nSource = nPos + 1;rn// while (TRUE)rn// rn// if (wStrRes[nSource] == L'\r')rn// rn// (*strUserID)[nDest] = L'\0';rn// break;rn// rn// (*strUserID)[nDest] = wStrRes[nSource];rn// nDest++;rn// nSource++;rn// rn// break;rn// rn// case 2:rn// rn// int nDest = 0;rn// int nSource = nPos + 1;rn// while (TRUE)rn// rn// if (wStrRes[nSource] == L'\r')rn// rn// (*moduleid)[nDest] = L'\0';rn// break;rn// rn// (*moduleid)[nDest] = wStrRes[nSource];rn// nDest++;rn// nSource++;rn// rn// break;rn// rn// case 3:rn// rn// int nDest = 0;rn// int nSource = nPos + 1;rn// while (TRUE)rn// rn// if (wStrRes[nSource] == L'\0')rn// rn// (*devicename)[nDest] = L'\0';rn// break;rn// rn// (*devicename)[nDest] = wStrRes[nSource];rn// nDest++;rn// nSource++;rn// rn// break;rn// rn// rn// rn// rn// nPos++;rn// rn// free(wStrRes);rn// return 0 ; //解密成功rnrnrn[/code]rn主要是调用这个函数rnrn在ocx用调用的那块被我简化成rn TCHAR szPath[MAX_PATH] = 0;rn GetModuleFileName(AfxGetInstanceHandle(), szPath, MAX_PATH);rn //GetCurrentDirectory(MAX_PATH,szPath);rn wchar_t* wchPos = wcsrchr(szPath,_T('\\'));rn wcscpy(wchPos,L"\\wtlicense.dat");rn wchar_t* szModuleID = new wchar_t[256];rn wchar_t* szDeviceInfo = new wchar_t[256];rn wchar_t* szUserID = new wchar_t[256];rn wchar_t* szDeviceInfoArry[64];rn int nDeviceInfoCount = 0; // int res ;rn res = DecyptFle(szPath,&szUserID,&szModuleID,&szDeviceInfo);rn if(res != 0)rn rn return FALSE;rn rnrn可以编译 就是不能注册 在release版本下,因为debug版本就不掉这个DecyptFle这个函数了,rn只要把DecyptFle这个代码屏蔽掉 就能注册rnrnrn求大神了 为啥 我找了好久也不知道为啥 已经用管理员权限试过了 不行rnrn操作希望win7 3位 论坛

■■■■■求助:OCX注册失败!!!!!DllRegisterServer 失败.错误码:0x80040200.....谢谢~~~

11-16

问题是这样的:rnrn我做了一个OCX,共享编译然后注册是可以的;rn我缓冲静态编译,然后注册就不成功了.....提示信息就是:DllRegisterServer 失败.0x80040200....rnrn我按照下面这篇文章试试了,也不行.仍然是那个错误....谢谢大家给点指导!!!rnrn关于ActiveX控件不能注册的解决方案 rn 发布日期:2007-11-9 13:32:25 点击次数:17 rn rnMFC中, 注册控件实际上是调用函数: DllRegisterServer(void),注册失败是因为下面这句函数调用失败:rnrn rnrn if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))rnrn return ResultFromScode(SELFREG_E_TYPELIB);rnrn rnrnAfxOleRegisterTypeLib函数原型:rnrnBOOL AfxOleRegisterTypeLib( HINSTANCE hInstance, REFGUID tlid, LPCTSTR pszFileName = NULL, LPCTSTR pszHelpDir = NULL );rnrn rnrn第三个参数pszFileName指的是类型库(.TLB)文件的名称rnrn rnrn当我们用向导生成MFC Activex工程时,IDE默认为工程名.TLB,所以编译后注册正常。但有时由于n多原因,AfxOleRegisterTypeLib 调用时并找不到TLB文件,于是就产生了诸如:rnrn rnrnrn rnrn“SZXPlayer.OCX中的DllRegisterServer失败,返回代码是: 0x80040200”这样的错误提示。rnrn rnrn这里有两个方案可以解决此问题rnrn一.由于TLB是接口类库,我们只需要调用AfxOleRegisterTypeLib时显示指明类型库文件名即可,例:rnrn rnrn if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid, "SZXPlayer.tlb"))rnrn //if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))rnrn return ResultFromScode(SELFREG_E_TYPELIB);rnrn rnrn同时将.LIB文件复制到.OCX文件相同路径下。OK, 一切都正常了。rnrn rnrn二.第一种方法显然不是最好的解决办法,这样的话控件都得带一个拖累(.TLB)了。根据通常的做法,我们可以把.TLB文件整个先写入到OCX文件中去。打开.RC文件,翻到最后,可以看到形如这样的内容:rnrn rnrn#ifndef APSTUDIO_INVOKEDrnrn/////////////////////////////////////////////////////////////////////////////rnrn//rnrn// Generated from the TEXTINCLUDE 3 resource.rnrn//rnrn rnrn/////////////////////////////////////////////////////////////////////////////rnrn#endif // not APSTUDIO_INVOKEDrnrn rnrn我们在其中加上TLB类库的信息就OK了,如下所示:rnrn rnrn#ifndef APSTUDIO_INVOKEDrnrn/////////////////////////////////////////////////////////////////////////////rnrn//rnrn// Generated from the TEXTINCLUDE 3 resource.rnrn//rnrn1 TYPELIB "SZXPlayer.tlb"rnrn/////////////////////////////////////////////////////////////////////////////rnrn#endif // not APSTUDIO_INVOKEDrnrn rnrn最后保存.RC文件, 再打开工程编译。rnrn rn 论坛

没有更多推荐了,返回首页