ATL问题,很急,今天晚上一定要搞定
我的一个ATL组件,是EXE文件,
我用VBScript能调用,
当用VC的CoCreateInstance却不行,返回的错误值是0X80029C4A
问题点数:200、回复次数:24Top
1 楼alphagx(alpha)回复于 2002-06-12 23:01:49 得分 0
奇怪的是在有的电脑上运行正常
Top
2 楼alphagx(alpha)回复于 2002-06-12 23:06:21 得分 0
我的组件的Proxy/Stub 文件也生成,并注册成功了。
为什么会出现上面的情况呢??
Top
3 楼Kevin_qing()回复于 2002-06-12 23:24:51 得分 0
gzTop
4 楼iterator(螃蟹)回复于 2002-06-12 23:29:45 得分 0
//
// MessageId: TYPE_E_CANTLOADLIBRARY
//
// MessageText:
//
// Error loading type library/DLL.
//
#define TYPE_E_CANTLOADLIBRARY _HRESULT_TYPEDEF_(0x80029C4AL)
注册有问题吧?Top
5 楼Savage_ts(野人)回复于 2002-06-12 23:29:59 得分 0
能把问题说清楚点吗?Top
6 楼loyee()回复于 2002-06-12 23:33:54 得分 200
#define TYPE_E_CANTLOADLIBRARY _HRESULT_TYPEDEF_(0x80029C4AL)
在创建ATL对象的时候,你在ATL内部是否调用了其他DLL?查看该DLL是否在运行的机器里面.
用DEPENDS工具查看你的ATL运行时需要的DLL,并查看这些运行环境在创建ATL对象的机器里面是否具备.
如果你的ATL依赖第三方开发环境,查看是否安装了第三方部件的运行环境.
Top
7 楼Savage_ts(野人)回复于 2002-06-12 23:40:55 得分 0
估计注册没有问题,要是有这个错误的话,就根本不能注册。错误是不能加载库,你可以去查一下MSDNTop
8 楼alphagx(alpha)回复于 2002-06-12 23:53:31 得分 0
But I can create and call the ATL Sever with VBScript..
Top
9 楼alphagx(alpha)回复于 2002-06-12 23:58:59 得分 0
我在组件中使用了ADO,我的系统是Win2K Server Sp2,
上面是空的系统,没有安装VC,VB之类的Top
10 楼loyee()回复于 2002-06-12 23:59:00 得分 0
也不能说注册绝对没有问题. LoadRegTypeLib ()系列的函数调用会导致这个错误.而这些函数都需要访问注册表.只是他对问题的描述还不够太具体.
是否可以把ATL对象的注册表内容贴出来?在VBScript中调用确定正常吗?CoCreateInstance(...)前面是否调用了CoInitialize(...)或进行其他初始话COM环境的操作?Top
11 楼alphagx(alpha)回复于 2002-06-13 00:02:31 得分 0
在VBScript中运行正常,
在CoCreateInstance(....)前面调用了
CoInit...
RGS文件中的 内容
HKCR
{
NoRemove AppID
{
{DE7B0787-4F8E-4396-ADCB-380F135CEB3A} = s 'NPSData'
'NPSDATA.EXE'
{
val AppID= s {DE7B0787-4F8E-4396-ADCB-380F135CEB3A}
}
}
}
Top
12 楼alphagx(alpha)回复于 2002-06-13 00:03:23 得分 0
这是接口的RGS文件
HKCR
{
NPSData.ConfigData.1 = s 'ConfigData Class'
{
CLSID = s '{60FB529A-4FD6-479D-9D09-33F413E52AE6}'
}
NPSData.ConfigData = s 'ConfigData Class'
{
CLSID = s '{60FB529A-4FD6-479D-9D09-33F413E52AE6}'
CurVer = s 'NPSData.ConfigData.1'
}
NoRemove CLSID
{
ForceRemove {60FB529A-4FD6-479D-9D09-33F413E52AE6} = s 'ConfigData Class'
{
ProgID = s 'NPSData.ConfigData.1'
VersionIndependentProgID = s 'NPSData.ConfigData'
ForceRemove 'Programmable'
LocalServer32 = s '%MODULE%'
val AppID = s '{DE7B0787-4F8E-4396-ADCB-380F135CEB3A}'
'TypeLib' = s '{B774E89A-EBAE-4E7E-B1F4-9C599AAAB916}'
}
}
}
Top
13 楼loyee()回复于 2002-06-13 00:10:58 得分 0
CoCreateInstance(...)中你的CLSID跟INTERFACE ID是什么呢?是否也可以说一下你的参数?Top
14 楼alphagx(alpha)回复于 2002-06-13 01:05:02 得分 0
hr = CoCreateInstance( CLSID_ConfigData,
NULL,
CLSCTX_ALL,
IID_IConfigData,
(void**) &ptrConfigData );
Top
15 楼loyee()回复于 2002-06-13 04:26:18 得分 0
调用方式应该没有什么问题.如果查了DLL没有缺少并且DLL版本都符合你运行ATL条件还是有问题的话,是否可以尝试下面的方法来调用ATL对象.
下面的方式应该跟你VBScript中调用非常接近.注意#import后面要跟你ATL对象文件名实际路径.using namespace后也要是你ATL对象的名字空间.根据你的登记项内容,NPSDATALib应该是Default名字.同时不要包含ATL对象一些接口的头文件.
如果确定ATL对象在VBScript能够运行的话,最大可能是VC中调用ATL对象方式的问题.只是用CoCreateInstance(...)没法调用的确很奇怪.
还有一个建议是,屏蔽ATL对象中的具体代码.只保留相同的接口,方法,属性等框架.用CoCreateInstance(...)调用看看是否可以创建ATL对象的实例,如果可以的话,然后再慢慢添加具体代码,找到哪些代码导致0x80029C4A的错误码.如果不行的话,应该是调用ATL对象方式的问题了.
#import "NPSData.exe"
using namespace NPSDATALib;
void LoadATL()
{
IConfigDataPtr pConfigData;
HRESULT hr;
CoInitialize(NULL);
hr = pConfigData.CreateInstance("'NPSData.ConfigData");
......
}Top
16 楼daehappy(追求120%结贴)回复于 2002-06-13 21:57:34 得分 0
up!关注!Top
17 楼loyee()回复于 2002-06-13 22:58:21 得分 0
正常情况下,在你的ATL对象的_tWinMain(...)中有下面的一段代码.
while (lpszToken != NULL)
{
if (lstrcmpi(lpszToken, _T("UnregServer"))==0)
{
_Module.UpdateRegistryFromResource(IDR_NpsDAta, FALSE);
nRet = _Module.UnregisterServer(TRUE);
bRun = FALSE;
break;
}
if (lstrcmpi(lpszToken, _T("RegServer"))==0)
{
_Module.UpdateRegistryFromResource(IDR_NpsDAta, TRUE);
nRet = _Module.RegisterServer(TRUE);
bRun = FALSE;
break;
}
lpszToken = FindOneOf(lpszToken, szTokens);
}
注意查看ATL对象的资源表中IDR_NpsDAta内容,位于"Registry"段中.IDR_NpsDAta就是你要写入\\HKEY_CLASSED_ROOT\APPID中的内容.为了更加保险,确定IDR_NpsDAta资源的语言类型为Englist(U.S.).
ATL有关写登记项内容是标准的过程.我想你没有必要自己用Reg...系列函数自己些.
如果你用VC模板生成ATL对象的话,好象不应该有这个问题的.Top
18 楼zdhe(zdhe)回复于 2002-06-13 23:49:53 得分 0
if you use own proxy/stub, you must registry AppID ...
in vbscript, the download package have generated this , and when donwload finish, IE automatically registered it.
you does need regist everything you need. when directly use in VC..Top
19 楼spidertan(灭蚊刀)回复于 2002-06-14 00:25:26 得分 0
Up!Top
20 楼alphagx(alpha)回复于 2002-06-14 16:20:53 得分 0
我也感觉特别奇怪,
我后来自己重新生成了一个项目,
一切OK。
虽然我的IDR_NpsData资源的语言类型为chinese(P.R.C)
TO: loyee
请到
http://www.csdn.net/expert/topic/797/797141.xm
拿分,这个帖子的问题我在这儿已经问了。
Top
21 楼chenybin(小马)回复于 2002-06-15 01:57:36 得分 0
UP!!!!!!!!!!Top
22 楼rick1126()回复于 2002-06-15 07:56:38 得分 0
还有提醒一点, 我发现组件在中文目录里面注册成功也无法调用, 不知道大家有没有类似情况.Top
23 楼alphagx(alpha)回复于 2002-06-15 11:06:48 得分 0
欢迎大家继续讨论。。。。。Top




