关于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]