洪华 发表于 2014-9-21 23:28:33

关于ActiveX技术问题

本帖最后由 洪华 于 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}'
[*]    }
[*]}
[*]}

复制代码
在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
不知是何原因?

页: [1]
查看完整版本: 关于ActiveX技术问题