- ホーム
- Other
- Win32API活用援用
Win32Apiをデータベース化し、選択した関数と必要な構造体をクリップボードに出力(読み物)
プログラムコードでなくて、お話です。
NonSoftさんの、Win32Api定義のサンプル(VB6)を愛用させていただいておりますが、
テキストエディターで検索するのに疲れ、Accessのデータベースに載せ替えてみました。
1.関数のテーブル
2.定数のテーブル
3.構造体のテーブル
を作成します。当然ADO+テキスト処理で自動でやります。
4.関数の宣言文から、関数毎の引数のテーブルを作ります。これもADO+テキスト処理で。
5.関数の帳票フォーム
→選択したレコードの単票フォーム(構造体のサブフォーム付)
→サブフォームから選択した引数のタイプの構造体宣言文のフォームを表示
といった感じで作ってみました。
更に追加して、
6.関数の帳票フォーム→出力するレコードにチェック
→チェック済みのレコードのレコードセットを抽出
→レコードセットの各レコードについて、引数テーブルから各引数を取り込み
→Dictionaryを用いて、大文字のタイプ名(構造体名)の重複しないリストを作成
7.Dictionaryから、構造体名のリストを取り出し、構造体のテーブルからレコードセットを抽出。
各構造体の宣言文を文字列で結合
8.最初のレコードセットを先頭に戻し、関数の宣言文(複数)を7の文字列に追記
9.クリップボードに文字列を収納
といった感じで、選択した関数と、必要な宣言文を一つの文字列にまとめ、
クリップボード経由でVBEなどに複写できる機能を実現できました。
後は、二つ設けてあるキーワードのフィールドに適当な分類を入れていくと、更に使いやすいものになると期待しています。
抽出するところのコードは下記の通り。複数レコードセットをここまで駆使したのは初めてです。
'チェックをつけたレコードと、用いているタイプ名を抽出し、テキスト生成
'「Microsoft Forms 2.0 Object Library」または、「C:\WINNT(または Windows)\system32\FM20.DLL」に参照設定要。
Private Sub extractButton_Click()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim rs2 As ADODB.Recordset
Dim buf As String, buf2 As String
Dim mySQL As String, mySQL2 As String
Dim i As Long
Dim myDic As Object
Dim myKey As Variant
Dim myDO As DataObject
Set myDic = CreateObject("Scripting.Dictionary")
'DataObjectオブジェクトのインスタンスの生成
Set myDO = New DataObject
Set cn = CurrentProject.Connection
Set rs = New ADODB.Recordset
Set rs2 = New ADODB.Recordset
'checkBoxを掴んでいると更新されないので、追加した
DoCmd.RunCommand acCmdSelectRecord
mySQL = "SELECT * FROM t_function WHERE check=true;"
rs.CursorLocation = adUseClient
rs.Open mySQL, cn, adOpenKeyset, adLockOptimistic
Do While Not rs.EOF
mySQL2 = "SELECT * FROM t_argment WHERE funcID='" & rs!funcID & "';"
rs2.Open mySQL2, cn, adOpenKeyset, adLockOptimistic
Do While Not rs2.EOF
buf = rs2!argtype
'大文字のタイプだけ対象とする
If (Asc(Left(buf, 1)) >= 65 And Asc(Left(buf, 1)) <= 90) Then
If Not myDic.exists(buf) Then
myDic.Add buf, ""
End If
End If
rs2.MoveNext
Loop
rs2.Close
rs.MoveNext
Loop
myKey = myDic.Keys
For i = 0 To myDic.Count - 1
mySQL2 = "SELECT * FROM t_type WHERE typeName='" & myKey(i) & "';"
rs2.CursorLocation = adUseClient
rs2.Open mySQL2, cn, adOpenKeyset, adLockOptimistic
If rs2.RecordCount >= 1 Then
If buf2 = "" Then
buf2 = rs2!declaration
Else
buf2 = buf2 & vbCrLf & vbCrLf & rs2!declaration
End If
End If
rs2.Close
Next i
rs.MoveFirst
Do While Not rs.EOF
buf2 = buf2 & vbCrLf & vbCrLf & rs!declareStatement
rs.MoveNext
Loop
'文字列のセット
myDO.SetText buf2
'クリップボードに転送
myDO.PutInClipboard
MsgBox "宣言文をクリップボードにコピーしました"
Set rs = Nothing
Set rs2 = Nothing
Set cn = Nothing
Set myDic = Nothing
End Sub
<実行例>
なんとかDCという名前の関数と、必要な構造体を抽出してみました
その構造体で更に必要な構造体まではサポートしておりませんが...
Type DEVMODE
dmDeviceName As String * CCHDEVICENAME
dmSpecVersion As Integer
dmDriverVersion As Integer
dmSize As Integer
dmDriverExtra As Integer
dmFields As Long
dmOrientation As Integer
dmPaperSize As Integer
dmPaperLength As Integer
dmPaperWidth As Integer
dmScale As Integer
dmCopies As Integer
dmDefaultSource As Integer
dmPrintQuality As Integer
dmColor As Integer
dmDuplex As Integer
dmYResolution As Integer
dmTTOption As Integer
dmCollate As Integer
dmFormName As String * CCHFORMNAME
dmUnusedPadding As Integer
dmBitsPerPel As Integer
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
End Type
Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Declare Function CancelDC Lib "gdi32" (ByVal hdc As Long) As Long
Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" (ByVal lpDriverName As String, ByVal lpDeviceName As String, ByVal lpOutput As String, lpInitData As DEVMODE) As Long
Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Declare Function GetDCEx Lib "user32" (ByVal hwnd As Long, ByVal hrgnclip As Long, ByVal fdwOptions As Long) As Long
Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long
Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Declare Function ResetDC Lib "gdi32" Alias "ResetDCA" (ByVal hdc As Long, lpInitData As DEVMODE) As Long
Declare Function RestoreDC Lib "gdi32" (ByVal hdc As Long, ByVal nSavedDC As Long) As Long
Declare Function SaveDC Lib "gdi32" (ByVal hdc As Long) As Long
Declare Function ScrollDC Lib "user32" (ByVal hdc As Long, ByVal dx As Long, ByVal dy As Long, lprcScroll As RECT, lprcClip As RECT, ByVal hrgnUpdate As Long, lprcUpdate As RECT) As Long
Declare Function WindowFromDC Lib "user32" (ByVal hdc As Long) As Long