C++中调用ActiveX组件的方法详解
来源:互联网 发布:qq for linux 最新版 编辑:程序博客网 时间:2024/06/05 22:36
本文以 "msscript.ocx" 作为参考
第一步:
获取头文件
#import "msscript.ocx"
得到两个文件 "msscript.tlh" 和 "msscript.tli" 整合下的到个头文件"msscript.h"如下:
+ View Code
第二步:
138#include
#include
//#import "msscript.ocx"
#include "msscript.h"
using namespace MSScriptControl;
HRESULT (STDAPICALLTYPE *pfnDllGetClassObject)(REFCLSID rclsid, REFIID riid, LPVOID* ppv) = 0;
int main()
{
//方式一
do
{
/*
@ 注意点
@ 1.没有判断返回值,后面直接使用 CoUninitialize 反初始化会出现问题。
@ 2.如果不主动调用释放也会出现崩溃,因为后面直接调用了 CoUninitialize,在智能指针析构时候会出错。
*/
::CoInitializeEx(NULL, COINIT_MULTITHREADED);//注意点【1】
CLSID clsid;
CLSIDFromProgID(OLESTR("MSScriptControl.ScriptControl.1"), &clsid);
CComPtr spScript;//智能指针
spScript.CoCreateInstance(clsid);
if (spScript != nullptr)
{
spScript->_AboutBox();
}
spScript.Release();//注意点【2】
::CoUninitialize();
} while (0);
//一下方式将解决上面的2个注意点
//解决注意点[【1】
HRESULT hr = ::CoInitializeEx(NULL, COINIT_MULTITHREADED);
std::shared_ptr tmpCoUninitialize(nullptr, [hr](void *) {
if (hr == S_OK)
{
::CoUninitialize();
}
});
//方式二
do
{
//最好使用 try catch 来处理
try
{
IScriptControlPtr spScript(__uuidof(ScriptControl)/*, NULL, CLSCTX_INPROC*/);
//ptr->Language = "VBScript";
//ptr->AllowUI = TRUE;
HRESULT hr = spScript->put_Language(_bstr_t(L"VBScript"));
hr = spScript->put_AllowUI(VARIANT_TRUE);
spScript->AddCode(_bstr_t(LR"-(
Private Function VBS_MsgBox()
Msgbox "你好!"
End Function
)-"));
spScript->Eval(_bstr_t(L"VBS_MsgBox"));
spScript->_AboutBox();
}
catch (const _com_error &e)
{
e.Description();
}
catch (...)
{
}
} while (0);
//方式三
do
{
//不注册组件 直接调用接口
HMODULE hMSScript = ::LoadLibraryExW(_T("msscript.ocx"), NULL, 0);
if (hMSScript != NULL)
{
*(LPVOID *)&pfnDllGetClassObject = ::GetProcAddress(hMSScript, "DllGetClassObject");
if (pfnDllGetClassObject != nullptr)
{
try
{
IClassFactoryPtr pClassFactory = NULL;
HRESULT hr = pfnDllGetClassObject(__uuidof(ScriptControl), IID_IClassFactory, (LPVOID*)&pClassFactory);
if (SUCCEEDED(hr) && pClassFactory != nullptr)前列腺炎会给男性带来哪些危害
{
IScriptControlPtr spScript;
hr = pClassFactory->CreateInstance(NULL, __uuidof(IScriptControl), (void **)&spScript);
if (SUCCEEDED(hr) && spScript != nullptr)
{
spScript->_AboutBox();
}
}
}
catch (const _com_error &e)
{
_bstr_t des = e.Description();
int j = 0;
}
}
::FreeLibrary(hMSScript);
}
} while (0);
//方式四
do
{
IClassFactoryPtr pClassFactory = NULL;
HRESULT hr = ::CoGetClassObject(
__uuidof(ScriptControl),成都青羊区做阴茎延长医院
CLSCTX_ALL,
NULL,
__uuidof(IClassFactory),
(void **)&pClassFactory);
if (SUCCEEDED(hr) && pClassFactory != nullptr)
{
IScriptControlPtr spScript;
hr = pClassFactory->CreateInstance(NULL, __uuidof(IScriptControl), (void **)&spScript);
if (SUCCEEDED(hr) && spScript != nullptr)
{
spScript->_AboutBox();
}成都好点的妇科医院在哪
}
} while (0);
//方式五
//在MFC窗口界面添加,可以得到接口类。
return 0;
}
- C++中调用ActiveX组件的方法详解
- VC中调用Com组件的方法详解
- vc中调用Com组件的方法详解
- vc中调用Com组件的方法详解
- VC++中调用Com组件的方法详解
- vc中调用Com组件的方法详解
- vc中调用Com组件的方法详解(转)
- vc中调用Com组件的方法详解
- vc中调用Com组件的方法详解
- vc中调用Com组件的方法详解
- vc中调用Com组件的方法详解
- vc中调用Com组件的方法详解
- vc中调用Com组件的方法详解
- vc中调用Com组件的方法详解
- vc中调用Com组件的方法详解
- vc中调用Com组件的方法详解
- vc中调用Com组件的方法详解
- vc中调用Com组件的方法详解
- 友盟微社区--手里多一个社区帐号
- maven本地仓库更改
- Scratch软件界面介绍
- linux .zip文件 解压缩命令的简单使用
- 面试准备之JVM的组成、垃圾回收机制
- C++中调用ActiveX组件的方法详解
- Android中OnScrollListener回调具体剖析
- Java 文件操作 File 及 RandomAccessFile
- ubuntu14.04 安装ros 开发环境
- [Unity3D] 技能图标的冷却效果和时间显示
- 常见错误
- Qt 学习之路 2(88):Canvas
- Java浮点数计算精度问题总结
- RDC如何构建一个基于Composer的PHP项目