COM

Python: win32com を使ってDBにADO接続してみる。

Python and ActiveX Data Objects (ADO)を参考にMS AccessのMDBにアクセスしてみました。 使用しているMDBは「Win32OLE 活用法 【第 3 回】 ADODB」のsample1.mdbです。 # -*- coding: cp932 -*- import win32com.client import sys import codecs # 参考 # …

COM を学ぶ(11) : HaskellでExcel(ワイド文字列バージョン)

Haskell から COM を呼ぶ場合 HaskellからSJISに変換した後に MultiByteToWideChar、 WideCharToMultiByteを使用していましたが、Haskell はUcs4、COMはUTF16を使っていますので、日本語で使う分には文字コードを変換する必要はありません。 SysAllocString …

COM を学ぶ(10) : SysAllocString を使って BSTR を作る。

Haskell から COM を呼ぶ ために MultiByteToWideCharを使わないでSysAllocStringで行うためのテストです。 SysAllocString で BSTR を作りますが、SysAllocStringはバイナリの文字列長を含まないワイド文字列の先頭アドレスを返します。読み取るときはCWStr…

Haskell から wxWidgets(C++) 経由で Excel を操作する。

このプログラムは"日本語.xls"のファイルを読み書きするものです。 文字列は newCWString でワイド文字列に変換します。 さらに C++ で wxString に変換しています。 今回サポートしているVariant型は文字列、LongのVariant型です。 {-# LANGUAGE ForeignFun…

Haskell から wxWidgets(C++) を呼ぶ

wxWidgetsには wxHaskell に使用されているGUI以外にも wxString、wxVariant など有用なライブラリがあります。 Haskell から wxWidgets の wxAutomationObject で COM を操作してみます。 (以下は wxWidgets がインストールされた環境を前提としています。…

COM を学ぶ(7) : HaskellでExcel

HaskellでExcelを読み書きしてみました。 Haskell のソースコードは UTF8。UTF8 のソースはコンパイルすると内部コードUCS4に変換されます。Windows は表面はSJISですが、COM を呼ぶときにはBSTRに変換しています。 ソースに書かれた文字列を直接Excelに書き…

COM を学ぶ(6) : C言語でExcel を操作する(Mingw)

C++ を Haskell から呼ぶのが大変だというのが分ったので、Ruby の win32ole.c を参考にC言語で Excel を操作する関数を書いてみました。 これらの関数を Haskell から呼べば HaskellでExcel を操作出来ます(^^)/ C++ ではシートから行・列を指定してCellsオ…

カレントディレクトリのファイル名からフルパス名を求める(Windows)

Haskell で Excel を操作するためにまずはファイル名からフルパス名を求めます。 import System.Win32.Com import System.Win32.Com.Automation import Debug.Trace getFullPathName :: String -> IO String getFullPathName fname = do createObject "Scrip…

Ruby の invoke メソッドだけで Excel にアクセスする。

C で Excel にアクセスするのには COM の invoke を使ってアクセスします。C で書く前に Ruby の invoke メソッドだけを使ってアクセスしてみます。 参考:Win32OLE 活用法 【第 2 回】 Excel COM を学ぶ(5) : Mingw で MS-Access,SQL server に接続 requir…

FFI を学ぶ(3) : 自前のCで書いたCOM で MS-Access、SQL server にアクセスする。

小さいMDBですが、10000回連続読み込みでもOKでした。 XP では正常に動作するが、VISTAではSEGV になった。 XP ではmalloc して LSICD の値を保持しているので ((IDispatch *)pDisp)->lpVtbl->Release( (void *)pDisp) で開放したあと free(pDisp) していた…

COM を学ぶ(5) : Mingw で MS-Access,SQL server に接続

COM C

小さい mdb ですけど 10000回連続読み込んでも、メモリ消費は増えませんでした。 参考にしたところ。 Win32OLE 製作過程の雑記 Ruby win32ole.c 「るびま」連載:Win32OLE 活用法 C++ アプリケーションではなく C アプリケーションからOLE オートメーション…

COM を学ぶ(4) : ProgID から CLSID を求める。

COM C

CLSID は GUID の別名として定義されています。 typedef struct _GUID { DWORD Data1; // 4バイト WORD Data2; // 2バイト WORD Data3; // 2バイト BYTE Data4[8]; // 1バイト×8 } GUID; typedef GUID CLSID; typedef GUID IID; ProgID "ADODB.Connection" …

COM を学ぶ(3) : Ruby の invoke メソッドだけでアクセスしてみる。

COMの仕組みを理解しようと Ruby の Win32OLE ドキュメント(win32ole: Ruby Standard Library Documentation)を追ってます。 前回の「COM を理解する(2):CでADODB.Connectionに接続する」にあるテーブルを表現した構造体に invoke がありますが、Ruby の …

COM を学ぶ(2):CでADODB.Connectionに接続する

COM C

GHCはCのコンパイルも出来ます。C言語でCOMクライアントを参考にして、SQL server, MS-Access にアクセスする ADODBConnection に接続してみました。 #include "stdio.h" #include "windows.h" #include "objbase.h" typedef struct tagMyVTable { /* VTable…

COM を学ぶ(1)

参考にしたサイト COMの基礎 〜 HSPの裏技?? 番外編 〜 HSPからのCOM操作 C言語でCOMクライアント 温COM知新 (おんこむちしん) ProgID とは--> "ADODB.Connection","ADODB.Recordset" : CLSIDを参照する文字 CLSID とは--> COMコンポーネントの識別子(GUID…

Segmentation fault/access violation in generated code

SQLserverにADO 接続をして検索するアプリを作ろうとしているのだけど、Segmentation fault/access violation in generated code が起きてしまう。 1回目はたいてい大丈夫で、2回は問題が発生しないこともあるけれど、3回、4回となるとSegmentation faul…

Haskell で MS-Access、SQL server のテーブルを読む

接続文字列 # http://oshiete1.goo.ne.jp/qa5196452.html # SQL Serverの場合、一般的に使われているのが、 #・Microsoft OLE DB Provider for ODBC(MSDASQL) #・Microsoft OLE DB Provider for SQL Server(SQLOLEDB) 〜最も一般的 #・Microsoft SQL Server …

Haskell で SQL server に接続

Re: Help on using System.Win32.Com.Automationを参考にSQL server に ADODB 接続してみました。 module Main where import System.Win32.Com import System.Win32.Com.Automation sqlStr = "SELECT count(*) FROM table;" userID = "userName" pass = "pas…

System.Win32.Com をいじってみる(clsidFromProgIDの巻)

clsidFromProgID をちょっといじってみました。 関数の名前が clsidFromProgID なので ProgID から clsid を作る。つまり、"ADODB.connection" が ProgID と言うもので "{00000514-0000-0010-8000-00AA006D2EA4}" が CLSID と言うことでしょうきっと。 GHCi,…