您的位置:首页 > 编程语言

纯手工代码使用COM/ActiveX控件(如何不通过注册表)

2007-03-01 12:43 716 查看
#include "objbase.h"
#include "atlcomcli.h"
#include "limits"
#import "msscript.ocx" no_namespace

//定义工厂方法签名
extern "C"{ typedef HRESULT (__stdcall *FuncDllGetClassObject)(REFCLSID rclsid,REFIID riid,LPVOID * ppv);}

struct IScriptControl;
int _tmain(int argc, _TCHAR* argv[])
{
try
{
//初始化
::CoInitialize (NULL);
HMODULE h=::LoadLibrary("msscript.ocx");
if(h==NULL)return 0;
FuncDllGetClassObject func=(FuncDllGetClassObject)::GetProcAddress(h,"DllGetClassObject");
if(func==NULL)return 0;
IClassFactory *pFactory=NULL;
func(__uuidof ( ScriptControl ),IID_IClassFactory,(void**)&pFactory);
if(pFactory==NULL)return 0;
IScriptControl *pScript=NULL;

//下面的代码实现效果和本行效果一样:pFactory->QueryInterface(__uuidof(IScriptControl) , (void**)&pScript);
//可以从注册表例看到该接口的IID为:0e59f1d3-1fbe-11d0-8ff2-00a0d10038bc
IID id;//=__uuidof(IScriptControl);
id.Data1=0x0e59f1d3;
id.Data2=0X1fbe;
id.Data3=0X11d0;

id.Data4[0]=0X8f;
id.Data4[1]=0Xf2;
id.Data4[2]=0X00;
id.Data4[3]=0Xa0;
id.Data4[4]=0Xd1;
id.Data4[5]=0X00;
id.Data4[6]=0X38;
id.Data4[7]=0Xbc;

//下面行的效果等于本行效果:pFactory->CreateInstance(NULL,__uuidof(IScriptControl) , (void**)&pScript);
pFactory->CreateInstance(NULL,id , (void**)&pScript);
pFactory->Release();

pScript->put_AllowUI(VARIANT_FALSE);
pScript->PutLanguage(L"JScript");

_variant_t v=pScript->Eval("1+2+3+4+5");

int i=pScript->Release();

::FreeLibrary(h);
::CoUninitialize();
return 0;
}
catch(...)
{
//::FreeLibrary(h);
::CoUninitialize();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐