ATL写的组件,怎么在本机无法注册,打包成cab文件放到服务器上,IE中下载就可以使用?在线求助。

alexmayer 2009-03-11 09:25:24
用VC6写的一个ATL组件,dll,其中还调用了其他我编写的动态库,将这些附加动态库的dll文件放到ATL组件的编译输出目录。在ATL工程中编译这个组件,执行到custom build中的
regsvr32 /s /c "$(TargetPath)"
echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg"
就出错了,显示regsvr32:“0x00fc415b”指令引用的“0x00000000”内存。该内存不能为“written”。

把那些附加动态库的dll文件都删除了,编译后执行custom build就没有任何提示,但控件当然也没有注册成功。

把组件和附加动态库打包成cab上传到服务器,再下载安装却可以正常在IE中使用。

这是什么原因啊。如果不能解决,岂不是不能本机调试了!!

在线等朋友帮忙。
...全文
293 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
sys0008 2009-03-18
  • 打赏
  • 举报
回复
估计缺少两个必要的DLL,用Depends查看下你的ocx都依赖那些DLL?
alexmayer 2009-03-18
  • 打赏
  • 举报
回复
有的机器下载也不成功,晕了。
zongfangaozfg 2009-03-18
  • 打赏
  • 举报
回复
你的DLL打包到.cab里面了,网页能下载么,我的为什么只下载了控件,没有下载控件依赖的DLL?
帮我看看:
http://topic.csdn.net/u/20090318/11/78bb17e7-f1ab-4c00-b418-23495a5afdf4.html
alexmayer 2009-03-18
  • 打赏
  • 举报
回复
我编译得到的是dll,用dependency查看,没有缺少的dll。

有几个附加的dll,编写是导出C++类的,没有dllmain函数。链接是用得.h文件加.lib的静态链接。
alexmayer 2009-03-17
  • 打赏
  • 举报
回复
LoadLibrary和LoadLibraryEx有什么不同,好像用LoadLibraryEx就可以注册成功。

其他附加的dll都是输出C++ CLass,没有dllmain。
alexmayer 2009-03-16
  • 打赏
  • 举报
回复
还没有找到原因,rgs是正确的。
oyljerry 2009-03-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 alexmayer 的回复:]
好像有点眉目了,是不是DllRegisterServer(void)没有操作注册表的缘故?
[/Quote]
查看你的rgs文件,这个文件里面描述了要修改的注册表信息等
alexmayer 2009-03-14
  • 打赏
  • 举报
回复
好像有点眉目了,是不是DllRegisterServer(void)没有操作注册表的缘故?
alexmayer 2009-03-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 oyljerry 的回复:]
那你看你regsvr32注册出错时的dll等是哪一个...
[/Quote]

regsvr32直接就崩溃了。

我自己写了一个reg工具,跟到这里

//装载ActiveX控件
HINSTANCE hLib = LoadLibrary(pszDllName);
if (hLib < (HINSTANCE)HINSTANCE_ERROR)
{
MessageBox("不能载入该控件文件!","错误",MB_OK);
return;
}
//获取注册函数DllRegisterServer地址
FARPROC lpDllEntryPoint;
lpDllEntryPoint = GetProcAddress(hLib,_T("DllRegisterServer"));
//调用注册函数DllRegisterServer
if(lpDllEntryPoint!=NULL)
{
if(FAILED((*lpDllEntryPoint)()))
{
MessageBox("控件注册失败!","错误",MB_OK);
FreeLibrary(hLib);
return;
}


竟然是if(FAILED((*lpDllEntryPoint)()))失败了,但我明明在def文件里输出了啊

; sweb.def : Declares the module parameters.

LIBRARY "sweb.DLL"

EXPORTS
DllCanUnloadNow @1 PRIVATE
DllGetClassObject @2 PRIVATE
DllRegisterServer @3 PRIVATE
DllUnregisterServer @4 PRIVATE



.cpp文件里也有

STDAPI DllCanUnloadNow(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
return (AfxDllCanUnloadNow()==S_OK && _Module.GetLockCount()==0) ? S_OK : S_FALSE;
}

/////////////////////////////////////////////////////////////////////////////
// Returns a class factory to create an object of the requested type

STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
{
return _Module.GetClassObject(rclsid, riid, ppv);
}

/////////////////////////////////////////////////////////////////////////////
// DllRegisterServer - Adds entries to the system registry

STDAPI DllRegisterServer(void)
{
// registers object, typelib and all interfaces in typelib
return _Module.RegisterServer(TRUE);
}

/////////////////////////////////////////////////////////////////////////////
// DllUnregisterServer - Removes entries from the system registry

STDAPI DllUnregisterServer(void)
{
return _Module.UnregisterServer(TRUE);
}

想不通了,等知道的朋友指导。
米格315 2009-03-11
  • 打赏
  • 举报
回复
学习
oyljerry 2009-03-11
  • 打赏
  • 举报
回复
那你看你regsvr32注册出错时的dll等是哪一个...
alexmayer 2009-03-11
  • 打赏
  • 举报
回复
用普通程序exe调用这些dll都不用注册dll。
alexmayer 2009-03-11
  • 打赏
  • 举报
回复
附加dll也需要注册?不应该呀。
oyljerry 2009-03-11
  • 打赏
  • 举报
回复
附加dll等都是也注册上了

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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