不通过注册表使用ActiveX对象

为了弄清楚COM库的运行原理,特意做了这个实验:

#include "stdafx.h"
#include "objbase.h"
#include "atlcomcli.h"
#include "limits"
//#include "commctrl.h"
#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);
  //0e59f1d3-1fbe-11d0-8ff2-00a0d10038bc
  //IID id;//=__uuidof(IScriptControl);
  IID id;
  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();
}
}
原文地址:https://www.cnblogs.com/stst/p/4908939.html