- 积分
- 1731
- 明经币
- 个
- 注册时间
- 2003-4-26
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
本帖最后由 洪华 于 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
不知是何原因?
|
|