//COM 接口 import vc6; var vc = vc6( "/" ) //输入 C++ 源码,自动存为 /comMain.cpp vc.comMain = /****** #include #include class CTestObject: public CCmdTarget { DECLARE_DYNCREATE(CTestObject) CTestObject(); protected: virtual ~CTestObject(); CString strName; public: afx_msg BSTR GetName(); afx_msg void SetName(LPCTSTR lpszName); DECLARE_DISPATCH_MAP() }; IMPLEMENT_DYNCREATE(CTestObject, CCmdTarget) CTestObject::CTestObject() { EnableAutomation(); AfxOleLockApp(); } CTestObject::~CTestObject() { AfxOleUnlockApp(); } BEGIN_DISPATCH_MAP(CTestObject, CCmdTarget) DISP_PROPERTY_EX(CTestObject, "name", GetName, SetName, VT_BSTR) END_DISPATCH_MAP() BSTR CTestObject::GetName() { return strName.AllocSysString(); } void CTestObject::SetName(LPCTSTR lpszName) { strName = lpszName; } extern "C" __declspec(dllexport) LPDISPATCH __cdecl CreateIDispatchObject() { LPDISPATCH pDispatch = ( new CTestObject() )->GetIDispatch(FALSE);//参数FALSE指定不要添加引用计数 return pDispatch; } ******/ //编译生成DLL vc.exec( 'cl comMain.cpp' ,'/W3' /*警告等级*/ ,'/MD' /*使用多线程动态运行库*/ ,'/O2 /Ot /EHsc' /*代码优化选项*/ ,'/D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_AFXDLL" ' /*定义常数和宏*/ ,'/I"./INCLUDE"'/*指定头文件目录*/ ,'kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib' /*导入库*/ ,'/link /SUBSYSTEM:WINDOWS /MACHINE:X86' /*后面是链接参数 */ ,'/out:test.disp.dll'/*输出文件名*/ ,'/dll' /*输出DLL*/ ,'/LIBPATH:".\LIB" /LIBPATH:".\LIB2"' /*指定库目录*/ ) //加载 DLL var dll = raw.loadDll("/test.disp.dll",,"cdecl"); //创建 COM 对象,aardio 可自动支持 IDispatch 接口 //doc://library-guide/builtin/com/com.md import com; var comObject = com.QueryObjectR( dll.CreateIDispatchObjectP() ); //使用 COM 对象 comObject.name = "测试"; console.log( comObject.name ); console.pause();