[这是一个整体,所以,今后就不在赘述其中的东西,除非是前期本人自己理解错误,会更正,同时特别备注]
没有加入加密功能,MD5/DES加密都已实现,但在资源和其他的文章中有描述,本文加入过于赘述。
没有数字签名和发布部分,还未完全明白。
调用:LOADDLL.dll
右键点击项目名称"ActiveXTest"选择 -> 添加[类] -> 选择[ATL简单对象] -> 添加 -> 简称(test_op) -> 下一步:其他不变,在[支持]中选择[连接点]和[IE对象支持]和[IEI] -> 完成 -> 选择[覆盖]
// test_op.h : Ctest_op 的声明 #pragma once #include "resource.h" // 主符号 #include "ActiveXTest_i.h" #include "_Itest_opEvents_CP.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 using namespace ATL; // Ctest_op class ATL_NO_VTABLE Ctest_op : public CComObjectRootEx<CComSingleThreadModel>, public CComCoClass<Ctest_op, &CLSID_test_op>, public ISupportErrorInfo, public IConnectionPointContainerImpl<Ctest_op>, public CProxy_Itest_opEvents<Ctest_op>, public IObjectWithSiteImpl<Ctest_op>, public IDispatchImpl<Itest_op, &IID_Itest_op, &LIBID_ActiveXTestLib, /*wMajor =*/ 1, /*wMinor =*/ 0> { public: //*******begin*****以下三行实现定义 add by 莫小哆_ly typedef int (_stdcall *testGetPwd)(int,char*,char*); //类型定义,对应LOADDLL.dll->LoadFunc方法 HINSTANCE hInstLibrary; testGetPwd _testGetPwd; //类映射 //*******end***** Ctest_op() { //*******begin*****开始调用DLL add by 莫小哆_ly hInstLibrary = LoadLibrary(L"C:\\WINDOWS\\system32\\LOADDLL.dll");//相对路径时把写好的LOADDLL.dll文件放在此项目生成的目录debug下。 if (hInstLibrary == NULL) { FreeLibrary(hInstLibrary);//资源释放 }else{ } //调用方法,返回方法句柄。 _testGetPwd = (testGetPwd)GetProcAddress(hInstLibrary, "LoadFunc"); //*******end***** } DECLARE_REGISTRY_RESOURCEID(IDR_test_op) BEGIN_COM_MAP(Ctest_op) COM_INTERFACE_ENTRY(Itest_op) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY(ISupportErrorInfo) COM_INTERFACE_ENTRY(IConnectionPointContainer) COM_INTERFACE_ENTRY(IObjectWithSite) END_COM_MAP() BEGIN_CONNECTION_POINT_MAP(Ctest_op) CONNECTION_POINT_ENTRY(__uuidof(_Itest_opEvents)) END_CONNECTION_POINT_MAP() // ISupportsErrorInfo STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid); DECLARE_PROTECT_FINAL_CONSTRUCT() HRESULT FinalConstruct() { return S_OK; } void FinalRelease() { } public: STDMETHOD(testFunc)(LONG iFlag, BSTR* passWord); }; OBJECT_ENTRY_AUTO(__uuidof(test_op), Ctest_op)
// test_op.cpp : Ctest_op 的实现 #include "stdafx.h" #include "test_op.h" //*****begin*****add by 莫小哆_ly //#include "md5.h"//用于MD5加密,与本文无关,略去 #pragma comment(lib, "comsuppw.lib") #include <comutil.h> //*****end***** // Ctest_op STDMETHODIMP Ctest_op::InterfaceSupportsErrorInfo(REFIID riid) { static const IID* const arr[] = { &IID_Itest_op }; for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++) { if (InlineIsEqualGUID(*arr[i],riid)) return S_OK; } return S_FALSE; } STDMETHODIMP Ctest_op::testFunc(LONG iFlag, BSTR* passWord) { // TODO: 在此添加实现代码 //*****begin*****add by 莫小哆_ly int iflag = (int)(iFlag); char* pwd = new char[7];//参考testFunc的约定长度。 char* mac = new char[33]; char *pwd_md5 = new char[32]; _testGetPwd(iflag,pwd,mac);//这里要求厂家提供的dll里(int,char*,char*) //结尾加结束符,防止数组溢出出现乱码[烫] pwd[6]='\0';//密码6位.0.1.2.3.4.5/pwd[6]->结束符 //MD5加密 //pwd_md5 = MD5String(pwd); //char*型转换成BSTR*类型 *passWord = _com_util::ConvertStringToBSTR(pwd); //*****end***** this->_AtlFinalRelease(); return S_OK; }
[version] signature="$CHICAGO{1}quot; AdvancedINF=2.0 [Add.Code] ActiveXTest.dll=ActiveXTest.dll LOADDLL.dll=LOADDLL.dll [install.files] ActiveXTest.dll=ActiveXTest.dll LOADDLL.dll=LOADDLL.dll [ActiveXTest.dll] file-win32-x86=thiscab RegisterServer=yes clsid={197E37FC-9916-4881-B766-D43FDD0376E8} DestDir=11 FileVersion=1,0,0,1 [LOADDLL.dll] file-win32-x86=thiscab DestDir=11 FileVersion=1,0,0,1 [RegisterFiles] %11%/ActiveXTest.dll
这个到底是什么情况,我也没搞清楚,反正选了个这个可以正常运行。
<HTML> <HEAD> <TITLE>New Page</TITLE> <OBJECT id=CaluNumCtrl codeBase="ActiveXTest.CAB#version=1,0,0,1" classid="clsid:3968A893-A79C-4AB9-B2FD-73BA2B76FB23"></OBJECT> <script language="javascript"> function doTest() { var pwd = CaluNumCtrl.testFunc(1); alert(pwd); } </script> </HEAD> <BODY> <input type="button" value="调用" id="btnOK" onclick="doTest();"></input> </BODY> </HTML>