こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

VB.NET DLL【API関数(コールバック関数)】の呼び出し方法について

目的は下記(3)のAPI関数をVB.NETで呼び出したいのですが、そこにいきつくまでにいろいろと壁にぶちあたっております。

(1)API関数をVB.NETから利用するにあたって
どのような手順および調査・学習すればVB.NETからWin32 APIを独力で呼び出せるようになるのでしょうか?ネット上に情報が乏しく、いきずまっております。

(2)API関数の調査方法、またコールバック関数について
下記(a),(b)のようにWin32 API関数を宣言して、あとは呼び出し側の関数で(a),(b)で宣言したAPI関数を記述するだけで基本的には使用できるようになるという大まかなイメージはつかめております。
このあとでAPI関数をMSDNで調べると引数がHWNDやPCTSTRなど見慣れないものが出てきて、次のURL(http://www.atmarkit.co.jp/fdotnet/dotnettips/024w32api/w32api.html)を見ると、APIの型とVB.NETの型は違うので型変換をしなければならないとあります。またさらに私が呼び出したい関数はコールバック関数なるものでこれまた?な状態です。
そこでAPIとVB.NETの型変換の調査方法およびコールバック関数の利用方法などを教えていただけないでしょうか?

(a)DllImport属性を利用する方法
<System.Runtime.InteropServices.DllImport("DLL名")> _
Function API関数名(仮引数)
End Function
(b)Declareステートメントを利用する方法
Declare Function API関数名 Lib "DLL名" (仮引数)

(3)InstallHinfSection関数(http://msdn2.microsoft.com/en-us/library/aa376957.aspx)について

下記のコードを実行したのですが、実行時エラーにはならないのですが、APIの関数が動作してくれません。どこが悪いのかがまったく見当がつかないのですがどなたかアドバイスいただけると助かります。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
InstallHinfSection(Nothing, Nothing, "DefaultInstall 132 C:\INF_TEST\Original.inf", 0)
End Sub
 
Declare Function InstallHinfSection Lib "setupapi" Alias "InstallHinfSection" (ByVal hwnd As String, ByVal ModuleHandle As String, ByVal CmdLineBuffer As String, ByVal nCmdShow As Integer) As Long

APIが難しすぎていろいろとおかしなことを書いているかもしれませんが、どうぞよろしくお願いいたします。

投稿日時 - 2007-10-03 17:01:55

QNo.3398027

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

>コールバック関数
これを直接呼び、実行することはありません。

コールバック関数は用意しておくものです。


仮に
※普通のAPI関数をA関数
※コールバック用の関数をB関数
とします

もしB関数を直接
Sub ボタンクリック()
  B関数(引数1,引数2)
End Sub
などとした場合、すでにこれはコールバック関数として利用していないことになります。



Sub ボタンクリック()
  A関数(引数1,B関数のアドレスポインタ)
End Sub
として、APIのA関数からB関数を実行する場合が、B関数をコールバック関数として利用したことになります。
よって、B関数を実行するロジックが、コード上には存在しないけど、実行されます。


[3355240:「フォルダの参照」ダイアログのタイトル変更]
http://okwave.jp/qa3355240.html

ここで、.NETでのコールバック実例を挙げました。
フォルダ参照の呼び出しの構造体に、関数ポインタを利用しています。


APIの利用は、MSDNと他のサンプルからのニラメッコから始めると思います。
もしCの知識が多少あれば、アドレス/ポインタの考え方を利用すると、置き換えもそれほど難しくありません。
基本は.NETであれば、ほとんど値渡しのIntegerかIntPtrで事足ります。
VB側で利用している変数のポインタを渡す事になります。

ただそれだと、毎回変数のアドレスを取得しなければなりません。わざわざ変数のアドレスを算出しなくてよい場合もあります。

まずAPI関数の個々の特性は、やはりMSDNやVBに限らずに参考文献を探し、理解することです。
それによって、構造体のまま参照渡しでもよいものもありますし、構造体領域分を確保したポインタを値渡しする場合もあります。
文字列変数をそのまま利用できるものもありますし、、、、、

それと人によって置き換え方は様々です。
[1267832:API,PathIsDirectoryについて]
http://okwave.jp/qa1267832.html


最後は結局「慣れ」だと思います。


「InstallHinfSection」についての質問ってことでなければ、上記で以上。


「InstallHinfSection」についての質問ってことであれば、、、すいません、、よくわかりません。

ただ、、、InstallHinfSectionってコールバックとして呼ばれる関数ですよね?
使ったことがないのでよくわからないのですが、、、ググると「rundll32.exe 」がセットで引っかかります。

※何をしようとしているか
※何を元に作成しているか(参考URL)
を載せると、もっと的を射たアドバイスができると思うのですが、、、

投稿日時 - 2007-10-04 01:08:10

補足

返信が遅くなり申し訳ありません。ご回答ありがとうございます。
改めてお伺いしたいのですが…
(1)コールバック関数は直接呼ぶのではなく、用意しておくものとのことですが、仮に「CALL コールバック関数(仮引数)」と直接呼び出すコーディングをしても使用できないということでしょうか?また、教えていただきましたサンプルのコールバック関数ですが、現在の私のレベルでは理解することができませんでした。もしよろしければ簡単なコールバック関数の呼び出しかたをご教授いただけないでしょうか?
(2)APIについて
やはり文献、参考URL探しからの調査で慣れですか…
1050YENさんのお勧めのURLや文献等ありましたら教えていただけないでしょうか?
(3)目的
INFファイルを使ってインストールを行いたいのですが、方法はINFファイルを右クリックでインストールか、RUNDLL32 InstallHinfSectionでコマンドプロンプトを実行するかの2通りしかいろいろと調査した結果見つけられませんでした。コマンドプロンプトのような外部アプリに頼らずに、InstallHinfSectionのAPI関数を直接コーディングすることで実現(APIの勉強も兼ねて)したいのですが、参考URL(http://www.trickpalace.net/windows/installer/)を見て作成しても動作せずに質問させて頂きました。海外サイトでも同様の試みを行った方がいたのですが、結局あきらめていらっしゃいました。

投稿日時 - 2007-10-10 09:35:10

あなたにオススメの質問