我用ATL写了一个控件,功能就是进行一系列的判断之后,要求下载一个dll文件,并对它进行注册,在VC里面编译的时候是对的但是后来把它放到网上,东西却没有下下来,但是自己写的那个控件却是注册好了的,请问这是为什么啊?

解决方案 »

  1.   

    应该是需要打包成cab,并签名,才能在internet上使用
      

  2.   

    页面显示就是一个小红叉?那我也不知道了对了,能把你的打包工具给我传一份吗?哪里都找不到啊,要不我把我的ocx打包完看看是不是有同样的问题,谢谢啦
      

  3.   

    恩 就是一个小红叉诶  怎么也解决不了
    我是用cabinet manager打包 东西装好后 就删掉了,你自己去网上下个吧 应该可以找到的虽然没有解决问题,还是谢谢你啊
      

  4.   

    cabinet manager只能打包,好像没有签名吧?是不是因为这个原因?
      

  5.   

    我看了下我的代码
    上面有  public IObjectSafetyImpl<CMyATL, INTERFACESAFE_FOR_UNTRUSTED_CALLER>
    这个是不是实现了安全接口啊安全接口应该要怎么设置呢?拜托帮帮忙咯,很急啊
      

  6.   

    下载个Microsoft ActiveX Control Pad试试
    签名与否与失败没有关系, 如果只是测试, 直接用ocx测试就好, 没有必要打成CAB, 测试成功后再打包成CAB比较好
      

  7.   

    既然能下载,肯定是客户端设置禁止运行了。
    还有一种情况,就是你设计时选择了license,这样生成了一个lic文件,需要和ocx打包到同一个cab中再签名
      

  8.   

    Ivy_zheng(最后一只恐龙) 我现在就是不能下载下来啊现在的情况就是 我自己写的那个控件是可以注册的,但是控件里面要做的下载另一个dll文件,并对这个下载的dll文件进行注册,都没有实现
    这些是因为 客户端禁止运行了吗?但是我什么安全接口啊 还有IE那里好像都已经设置好类你说的另一种情况,我也不知道,我好像没有选择license,明天再看看呢
    真是一头雾水啊,我是菜鸟一个,什么都不懂,问题也解决不了。tyong(伊面)
    你说的 ,我明天也去试试看呢
      

  9.   

    TO crazycyber(没新意) 
    我控件本身在VC里面是没有问题的呀,下载啊注册都可以实现的,就是到了网上用不了另外,实现安全接口是不是就只要
    public IObjectSafetyImpl<Cmonitor, INTERFACESAFE_FOR_UNTRUSTED_CALLER>
    COM_INTERFACE_ENTRY(IObjectSafety)
    这两句话在程序中就可以了吧?
      

  10.   

    据说是安全接口问题,我试了以下的代码,加在文件"你控件.cpp"中
    #include <comcat.h>
    #include <Objsafe.h>
    const GUID CDECL BASED_CODE _ctlid =
    { 你控件的ID}; 
    const CATID CATID_SafeForScripting =
    {0x7dd95801,0x9882,0x11cf,{0x9f,0xa9,0x00,0xaa,0x00,0x6c,0x42,0xc4}};
    const CATID CATID_SafeForInitializing =
    {0x7dd95802,0x9882,0x11cf,{0x9f,0xa9,0x00,0xaa,0x00,0x6c,0x42,0xc4}};HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription)
    {
       ICatRegister* pcr = NULL ;
       HRESULT hr = S_OK ;   hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
                             NULL,
                             CLSCTX_INPROC_SERVER,
                             IID_ICatRegister,
                             (void**)&pcr);
       if (FAILED(hr))
          return hr;   // Make sure the HKCR\Component Categories\{..catid...}
       // key is registered
       CATEGORYINFO catinfo;
       catinfo.catid = catid;
       catinfo.lcid = 0x0409 ; // english   // Make sure the provided description is not too long.
       // Only copy the first 127 characters if it is
       int len = wcslen(catDescription);
       if (len>127)
          len = 127;
       wcsncpy(catinfo.szDescription, catDescription, len);
       // Make sure the description is null terminated
       catinfo.szDescription[len] = '\0';   hr = pcr->RegisterCategories(1, &catinfo);
       pcr->Release();   return hr;
    }// Helper function to register a CLSID as belonging to a component
    // category
    HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
    {
       // Register your component categories information.
       ICatRegister* pcr = NULL ;
       HRESULT hr = S_OK ;
       hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
                             NULL,
                             CLSCTX_INPROC_SERVER,
                             IID_ICatRegister,
                             (void**)&pcr);
       if (SUCCEEDED(hr))
       {
          // Register this category as being "implemented" by
          // the class.
          CATID rgcatid[1] ;
          rgcatid[0] = catid;
          hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);
       }   if (pcr != NULL)
          pcr->Release();   return hr;
    }STDAPI DllRegisterServer(void)
    {
        AFX_MANAGE_STATE(_afxModuleAddrThis);    if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
            return ResultFromScode(SELFREG_E_TYPELIB);    if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
            return ResultFromScode(SELFREG_E_CLASS);    if (FAILED( CreateComponentCategory(
                CATID_SafeForScripting,
                L"Controls that are safely scriptable") ))
              return ResultFromScode(SELFREG_E_CLASS);    if (FAILED( CreateComponentCategory(
                CATID_SafeForInitializing,
                L"Controls safely initializable from persistent data") ))
              return ResultFromScode(SELFREG_E_CLASS);    if (FAILED( RegisterCLSIDInCategory(
                _ctlid, CATID_SafeForScripting) ))
              return ResultFromScode(SELFREG_E_CLASS);    if (FAILED( RegisterCLSIDInCategory(
                _ctlid, CATID_SafeForInitializing) ))
              return ResultFromScode(SELFREG_E_CLASS);    return NOERROR;
    }
    别人说就OK了,但是我一直没有试成功。
    浏览本地网页时可以正常下载、注册,在container test中也可以用,在网页中一直显示小红叉。
    不知道是什么原因。
      

  11.   

    出现红叉??
    你是不是指定了版本自动升级包(CODEBASE)?? 
    如果CODEBASE的路径无效是会出现红叉测试时,如果对html编程不熟悉, 强烈推荐使用Microsoft ActiveX Control Pad
      

  12.   

    to tyong(伊面)
    我也觉得不是安全接口的问题,因为我都已经是设置好了的另外你说的 指定了版本自动升级包(CODEBASE)
    是指html上指定吗?不关程序的事情吧 放到网上不是我弄的,另一个人负责的,他应该对html是很熟悉的
    搞不懂现在的问题究竟是不是我这里产生的
      

  13.   

    我是指网页,如果嵌入ocx的时候加入了CODEBASE标签,你可以看看代码确认下
      

  14.   

    不应该是路径问题。
    首先,那个网页测试别人的控件都是可以的,唯独自己的不行。
    其次,我在打开网页前,控件已经卸载了,打开之后在activex container中显示其已经注册,而且也是可以用的
      

  15.   

    我看了下,有CODEBASE标签的,不过路径不为空,而且是有效的。
    另外我嵌入的是一个dll文件。现在的问题就是 我的dll没有得到运行,会是dll程序本身的问题吗?我在VC++里面调试 一切都很正常啊。
      

  16.   

    是显示不出来你的activex控件 ,还是你的activex控件没有界面,只是把dll下下来,然后在显示dll的控件?
      

  17.   

    是我的dll控件没有得到运行,现在肯定不是安全接口的问题
      

  18.   

    activex下载后如果运行了,就会自动注册!你要在DllMain的DLL_PROCESS_ATTACH中下载你的dll
      

  19.   

    TO luoqi(luoqi)
    但是我现在自己的控件是可以注册了呀,照你的意思的话,就是它已经运行了?
    但是运行的结果却没有呢还有你说 要在 在DllMain的DLL_PROCESS_ATTACH中下载你的dll 是不是我控件的操作都要在这里进行啊?
      

  20.   

    你下载别人的ocx试试,确定是ocx的问题还是网页的脚本问题