COM を学ぶ(1)

参考にしたサイト

ProgID とは--> "ADODB.Connection","ADODB.Recordset" : CLSIDを参照する文字
CLSID とは--> COMコンポーネントの識別子(GUID)

  GUID : {00000514-0000-0010-8000-00AA006D2EA4}
  PROGID : ADODB.Connection.2.8
  GUID : {00000535-0000-0010-8000-00AA006D2EA4}
  PROGID : ADODB.Recordset.2.8

IID とは--> COMコンポーネントが持っているインターフェースの識別子(GUID)
インターフェース とは--> COMコンポーネントのメソッドへのポインタのテーブル

*Rubyに付属の Win32OLE View で調べたもの

Class  Connection
  GUID : {00000514-0000-0010-8000-00AA006D2EA4}
  PROGID : ADODB.Connection.2.8
  DESCRIPTION : 

FUNC VOID Close
  Dispatch ID : 5
  DESCRIPTION : 

FUNC _Recordset Execute
  Dispatch ID : 6
  DESCRIPTION : 
  arg1 - BSTR CommandText [IN]
  arg2 - VARIANT RecordsAffected [OUT,OPTION]
  arg3 - I4 Options [IN,OPTION] = -1

FUNC VOID Open
  Dispatch ID : 10
  DESCRIPTION : 
  arg1 - BSTR ConnectionString [IN,OPTION] = 
  arg2 - BSTR UserID [IN,OPTION] = 
  arg3 - BSTR Password [IN,OPTION] = 
  arg4 - I4 Options [IN,OPTION] = -1

FUNC UI4 Release
  Dispatch ID : 1610612738
  DESCRIPTION : 

タイプライブラリ とは --> VBからCOMオブジェクトへアクセスするための「インターフェイス」が格納されているライブラリ。

GUID 構造体 (CLSID も IID も、形は同じ構造体。型の別名として定義されている。)

typedef struct _GUID {
    DWORD  Data1;      // 4バイト
    WORD   Data2;      // 2バイト
    WORD   Data3;      // 2バイト
    BYTE   Data4[8];   // 1バイト×8
} GUID;

typedef GUID  CLSID;
typedef GUID  IID;

Haskell で接続する様子。

Main> :m + System.Win32.Com
Main> :m + System.Win32.Com.Automation

Main> clsidFromProgID "ADODB.Connection"
{00000514-0000-0010-8000-00AA006D2EA4}

Main> clsidFromProgID "ADODB.Recordset"
{00000535-0000-0010-8000-00AA006D2EA4}

Main> let iidIDispatch_unsafe  = mkIID "{00020400-0000-0000-C000-000000000046}"
Main> iidIDispatch_unsafe
{00020400-0000-0000-C000-000000000046}

Main> coCreateObject  "ADODB.Connection"  iidIDispatch_unsafe
"<interface pointer = "0x03c00e90">"

Main> coCreateObject "ADODB.Recordset" iidIDispatch_unsafe
"<interface pointer = "0x03c06bf0">"