ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月28日(木) 21:16

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 1 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2006年2月25日(土) 15:29 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
1. egtrCoCreateInstanceとegtrGUIDFromString
 ABでCOMのオブジェクトを作るのに使うCoCreateInstance関数は作成するクラスを決めるためにクラスIDを必要とします。
しかし,クラスの識別にはクラスIDだけではなく,プログラムIDなどもあります。
クラスIDはGUID型で数値の羅列ですが,プログラムIDはもう少し分かりやすく文字列になっています。
VBなどでCreateObjectを使ったことがあれば,まさにその引数がプログラムIDです。

 そこでこれはプログラムIDからのオブジェクトの作成するための関数です。
またレジストリなどで見かける{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}形式の文字列も受け付けるので,
いちいちGUID型の変数の初期化を書かずに済むという使い方もあります。

 またプログラムIDなどからCLSIDを取り出す部分だけを抜き出してegtrGUIDFromStringという関数にまとめてあります。
どちらもどうやらBytePtr型とString型でのオーバーロードができないようなので,仕方なく関数名に接尾辞(サフィックス)を付けて対処しています。

例は次のCreateShortcutを見てください。

egtrGUIDFromString
コード:
Function egtrGUIDFromString_PStr(pString As BytePtr, ByRef guid As GUID) As HRESULT
Function egtrGUIDFromString_Str(str As String, ByRef guid As GUID) As HRESULT
Function egtrGUIDFromString_PStrLen(pString As BytePtr, length As Long, ByRef guid As GUID) As HRESULT
Function egtrGUIDFromString_PWStr(pwString As *WCHAR, ByRef guid As GUID) As HRESULT
  • pwString/pString/str 基となるプログラムID或いはGUIDの文字列を指定します。
  • length pProgIDで指定された文字列の長さを指定します。ヌル終端文字列ならlengthの引数が無いオーバーロードを使用できるので,この引数は通常使わないでしょう。
  • guid 結果を受け取るGUID型の変数を指定します。
egtrCoCreateInstance
コード:
Function egtrCoCreateInstance_PStr(pProgID As BytePtr, ByRef iid As IID, ppv As *VoidPtr) As HRESULT
Function egtrCoCreateInstance_Str(strProgID As String, ByRef iid As IID, ppv As *VoidPtr) As HRESULT
Function egtrCoCreateInstance_PStrLen(pProgID As BytePtr, length As Long, ByRef iid As IID, ppv As *VoidPtr) As HRESULT
Function egtrCoCreateInstance_ProgID(pwProgID As *WCHAR, ByRef iid As IID, ppv As *VoidPtr) As HRESULT
Function egtrCoCreateInstance_ClsID(ByRef clsid As CLSID, ByRef iid As IID, ppv As *VoidPtr) As HRESULT
  • pwProgID/pProgID/strProgID クラスのプログラムID或いはクラスIDの文字列を指定します。
  • length pProgIDで指定された文字列の長さを指定します。ヌル終端文字列ならlengthの引数が無いオーバーロードを使用できるので,この引数は通常使わないでしょう。
  • clsid クラスIDを指定します。egtrCoCreateInstance_ClsIDはCoCreateInstanceの引数が簡略化されたものとして使えます。
  • iid 結果を受け取るインターフェイスのIDです。
  • ppv 結果を受け取るため「インターフェイスへのポインタ」へのポインタを指定します。
2. CreateShortcut
 また,そのサンプルとしてショートカットを作る関数を作りました。
#サンプルのはずが結構長い分量になり,これ1つでネタにできるほどになってしまいました。
 このプログラムではC:\にメモ帳へのショートカットを作っています。

 使い方はShortcutInfoに情報を指定して,CreateShortcut関数を呼びます。
ShortcutInfo構造体ではショートカット先のパス以外を指定する場合,FlagsメンバをOrで指定してください。

 実際に他のプログラムへ組み込んで使うには「CreateShortcutの本体」とこの後の「インターフェイスの宣言」,
「1. egtrCoCreateInstanceとegtrGUIDFromString」及び「3. GetErrorStr」のコードを適当なファイルに貼り付けてプロジェクトに参加させてください。

ウィンドウプログラムではCreateイベントでCoInitializeを,DestroyイベントでCoUninitializeを呼んでください。
そうでなければ,この例のようにプログラムの開始時と終了時に呼べばよいです。
 ただし,CoInitializeとCoUninitializeはスレッド単位です。
メインスレッド以外でCOMを使う場合は,そのスレッド内でCoInitializeとCoUninitializeを呼ぶ必要があります。
コード:
#strict

' ----------------------------------------------------------------
' ここからプログラムが実行されます。

Dim hr As HRESULT

hr = CoInitialize(0)
If hr <> S_OK Then
	MessageBoxStr(0, GetErrorStr(hr As DWord), "初期化に失敗", MB_ICONERROR)
	End
End If

Dim Buf[ELM(MAX_PATH)] As Byte
GetWindowsDirectory(Buf, MAX_PATH)
lstrcat(Buf, "\Notepad.exe")
Dim si As ShortcutInfo
si.pszPath = Buf
hr = CreateShortcut(si, "C:\メモ帳.lnk")
If hr <> S_OK Then
	MessageBoxStr(0, GetErrorStr(hr As DWord), "ショートカット作成に失敗", MB_ICONERROR)
End If
CoUninitialize()

End

Function MessageBoxStr(hwnd As HWND, strText As String, pszCaption As BytePtr, uType As DWord) As Long
	MessageBox(hwnd, StrPtr(strText), pszCaption, uType)
End Function
こちらがCreateShortcutの本体です。 さらに例によってインターフェイスの宣言が必要です。 3. GetErrorStr
 これはGetLastErrorやHRESULTの値からFormatMessageを使用してString型の文字列に変換します。
FormatMessageは,ヘルプで引いても何も書いてありませんが,実はHRESULTの値にも有効です。
 逆にGetLastError()のエラー番号からHRESULT_FROM_WIN32(1. egtrCoCreateInstanceとegtrGUIDFromStringのコード内にあります)
を使えばHRESULTへ変換できるということのも覚えておいて損ではありません。


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 1 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[13人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean