

目的は下記(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/024 …を見ると、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/aa37695 …について
下記のコードを実行したのですが、実行時エラーにはならないのですが、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が難しすぎていろいろとおかしなことを書いているかもしれませんが、どうぞよろしくお願いいたします。
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.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)
を載せると、もっと的を射たアドバイスができると思うのですが、、、
この回答への補足
返信が遅くなり申し訳ありません。ご回答ありがとうございます。
改めてお伺いしたいのですが…
(1)コールバック関数は直接呼ぶのではなく、用意しておくものとのことですが、仮に「CALL コールバック関数(仮引数)」と直接呼び出すコーディングをしても使用できないということでしょうか?また、教えていただきましたサンプルのコールバック関数ですが、現在の私のレベルでは理解することができませんでした。もしよろしければ簡単なコールバック関数の呼び出しかたをご教授いただけないでしょうか?
(2)APIについて
やはり文献、参考URL探しからの調査で慣れですか…
1050YENさんのお勧めのURLや文献等ありましたら教えていただけないでしょうか?
(3)目的
INFファイルを使ってインストールを行いたいのですが、方法はINFファイルを右クリックでインストールか、RUNDLL32 InstallHinfSectionでコマンドプロンプトを実行するかの2通りしかいろいろと調査した結果見つけられませんでした。コマンドプロンプトのような外部アプリに頼らずに、InstallHinfSectionのAPI関数を直接コーディングすることで実現(APIの勉強も兼ねて)したいのですが、参考URL(http://www.trickpalace.net/windows/installer/)を見て作成しても動作せずに質問させて頂きました。海外サイトでも同様の試みを行った方がいたのですが、結局あきらめていらっしゃいました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAでfunctionを利用しようとしたときに「引数は省略できません」というエラーが出ます 1 2022/10/15 16:30
- Access(アクセス) Vba Userformを前面に出すについて 3 2022/04/15 12:29
- オープンソース Coinmarketcap api 1 2022/05/30 15:47
- Excel(エクセル) エクセルの自動更新のタイミングについて 1 2022/07/20 16:12
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
戻り値で構造体を返すことは可...
-
Run-Time Check Failure #3とい...
-
PASCALとFARの意味
-
セグメントエラー
-
init関数の意味
-
CWnd::EnableWindow()の扱い方
-
C言語、配列とポインタとアスタ...
-
Cで作成したDLL関数をVBから呼...
-
ハンドルはポインタか
-
構造体を値で渡す良い点はあり...
-
C言語のポインタに直接アドレス...
-
#define NULL ((void *)0) の弊害
-
1mWの緑レーザポインタで紙は、...
-
プログラミングのfarについて
-
クラスの参照渡しとメンバ変数...
-
Segment情報の取得と設定
-
構造体の削除について
-
FT_Memoryというオブジェクトは...
-
関数内、ファイルのstatic変数
-
どうしてエラーになるかわかり...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
fopne で失敗する原因
-
戻り値で構造体を返すことは可...
-
LPSTR型の初期化について
-
Run-Time Check Failure #3とい...
-
ExcelVBAでのkernel32(64bit)
-
参照型で受け取った引数をポイ...
-
init関数の意味
-
セグメントエラー
-
アプリを32bitから64bit移行
-
ハンドルはポインタか
-
ハンドル、アドレス、ポインタ...
-
C言語でのconstを返す関数
-
C++で関数ポインタから関数名を...
-
パスからファイル名を抽出
-
ReadFileの読み込みエラーについて
-
#define NULL ((void *)0) の弊害
-
CImage GetBitsメソッドについて
-
ポインタ変数の疑問
-
Cで作成したDLL関数をVBから呼...
おすすめ情報