明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 976|回复: 0

关于ActiveX技术问题

[复制链接]
发表于 2014-9-21 23:28:33 | 显示全部楼层 |阅读模式
本帖最后由 洪华 于 2014-9-21 23:46 编辑

我在学习C++设计ActiveX函数,然后采用Vlisp来调用这些函数的方法,但不知为何原因不成功,


如下C++文件:
  • 以下为dingATL.h文件
  • // dingATL.h : CdingATL 的声明
  • #pragma once
  • #include "resource.h"       // 主符号
  • #include "TestEncryDll_i.h"
  • #if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
  • #error "Windows CE 平台(如不提供完全 DCOM 支持的 Windows Mobile 平台)上无法正确支持单线程 COM 对象。定义 _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA 可强制 ATL 支持创建单线程 COM
  • 对象实现并允许使用其单线程 COM 对象实现。rgs 文件中的线程模型已被设置为“Free”,原因是该模型是非 DCOM Windows CE 平台支持的唯一线程模型。"
  • #endif
  • // CdingATL
  • class ATL_NO_VTABLE CdingATL :
  •   public CComObjectRootEx<CComSingleThreadModel>,
  •   public CComCoClass<CdingATL, &CLSID_dingATL>,
  •   public IDispatchImpl<IdingATL, &IID_IdingATL, &LIBID_TestEncryDllLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
  • {
  • public:
  •   CdingATL()
  •   {
  •   }
  • DECLARE_REGISTRY_RESOURCEID(IDR_DINGATL)
  • BEGIN_COM_MAP(CdingATL)
  •   COM_INTERFACE_ENTRY(IdingATL)
  •   COM_INTERFACE_ENTRY(IDispatch)
  • END_COM_MAP()
  •   DECLARE_PROTECT_FINAL_CONSTRUCT()
  •   HRESULT FinalConstruct()
  •   {
  •     return S_OK;
  •   }
  •   void FinalRelease()
  •   {
  •   }
  • public:
  •   STDMETHOD(GetDisk)(CHAR* cdisk);
  • };
  • OBJECT_ENTRY_AUTO(__uuidof(dingATL), CdingATL)
  • 以下为dingATL.cpp文件
  • // dingATL.cpp : CdingATL 的实现
  • #include "stdafx.h"
  • #include "dingATL.h"
  • #include "reg.h"
  • // CdingATL
  • STDMETHODIMP CdingATL::GetDisk(CHAR* cdisk)
  • {
  •   AFX_MANAGE_STATE(AfxGetAppModuleState());
  •   // TODO: 在此添加实现代码
  •      cdisk="dgdgsgfg";
  •   return S_OK;
  • }
  • 以下为dingATL.rgs文件
  • HKCR
  • {
  •   TestEncryDll.dingATL.1 = s 'dingATL Class'
  •   {
  •     CLSID = s '{3ED70CC5-3355-4ED8-AF59-ADA26E5454A5}'
  •   }
  •   TestEncryDll.dingATL = s 'dingATL Class'
  •   {
  •     CLSID = s '{3ED70CC5-3355-4ED8-AF59-ADA26E5454A5}'
  •     CurVer = s 'TestEncryDll.dingATL.1'
  •   }
  •   NoRemove CLSID
  •   {
  •     ForceRemove {3ED70CC5-3355-4ED8-AF59-ADA26E5454A5} = s 'dingATL Class'
  •     {
  •       ProgID = s 'TestEncryDll.dingATL.1'
  •       VersionIndependentProgID = s 'TestEncryDll.dingATL'
  •       ForceRemove 'Programmable'
  •       LocalServer32 = s '%MODULE%'
  •       'TypeLib' = s '{D5C38C14-C41E-4816-A309-9BDFFE76807C}'
  •     }
  •   }
  • }

[color=rgb(51, 102, 153) !important]复制代码

在Vlisp中调用的方法是:
(vlax-import-type-library
    :tlb-filename        "TestEncryDll.exe"  :methods-prefix
    "msw-"                :properties-prefix  "msw-"
    :constants-prefix        "mswc-"
)
;;;上述函数返回T,并且在Vlisp编辑器中能看到C++的开放的函数GetDisk
(setq msw (vlax-get-or-create-object "TestEncryDll.dingATL.1"))
而vlax-get-or-create-objec返回值则为nil
不知是何原因?

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 06:49 , Processed in 0.142034 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表