由于我个人不是很了解ATL的东西,所以先写了一个Win32 DLL,在Win32 DLL中实现了实际的操作。然后再写了一个ATL DLL,ATL DLL主要是实现了接口定义,然后在接口函数中调用Win32 DLL,采用隐式调用(包含Win32 lib)。
自己写了一个VB的程序调用这个ATL DLL,一切正常。写了一个VC的测试程序调用ATL DLL,也一切正常。当用WEB来调用这个ATL DLL的时候,采用VB Script,提示的错误是:ActiveX部件不能创建对象。WEB的代码如下:
<html>
<body>
<script language="VbScript">
On Error Resume Next
set oReq =CreateObject("xxxLib.xxxEngine")
if err<>0 then 
alert Err.Description
else
alert("hi")
end if
</script>
<br>
</body>
</html>
其中xxxLib是ATL DLL定义的库,xxxEngine是ATL的接口。有谁知道这个是为什么?应该如何改?

解决方案 »

  1.   

    自动化接口?
    不明白为什么Cpp一定要让Web来调用实现。
      

  2.   

    1.如何看接口是否是自动化接口?
    2.没有办法,客户是用Web编写东西的,我只能提供一个atl控件给客户在web中使用。我最希望用c,这样我连atl都不用学。
      

  3.   

    实现IDISPATCH
    静态链接那个win32 DLL
      

  4.   

    既然你是atl的很简单加两句话
    public IObjectSafetyImpl<CAtlCtrl, INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA>
    COM_INTERFACE_ENTRY(IObjectSafety)
      

  5.   

    不好意思,我对atl不是很熟悉,应该加在哪里?加在.h还是.idl?
      

  6.   

    用VC的Wizard生成一个ATL的ACTIVEX你看看,和你工程的区别在那里,就知道
    public   IObjectSafetyImpl <CAtlCtrl,   INTERFACESAFE_FOR_UNTRUSTED_CALLER ¦INTERFACESAFE_FOR_UNTRUSTED_DATA> 
    COM_INTERFACE_ENTRY(IObjectSafety)
    应该放在什么地方了
      

  7.   

    http://www.vckbase.com/document/viewdoc/?id=1191lz参考以上URL
      

  8.   

    也不知道自己改了什么,把机器重新启动,一切就ok了。最大的变化就是把Win32 DLL拷贝到了windows/system32下。