Excel VBA で DLL内 の関数を呼び出す

\ あなたにピッタリの銘柄がみつかる /

みんかぶプレミアムを無料体験!

プランをみる

さらにお得なキャンペーン!

資産形成応援キャンペーン

期間内であればいつでもエントリーOK

2011/09/08 - LONERさんの株式ブログ。タイトル:「Excel VBA で DLL内 の関数を呼び出す」 本文:次の方法で呼び出せるらしい。Declare Function 関数名 Lib "DLL名" Alias "API名" (引数…) As 戻り値の型次の文は、Excel VBA

株式会社ミンカブ・ジ・インフォノイド
(C) MINKABU THE INFONOID, Inc.

Excel VBA で DLL内 の関数を呼び出す

LONERさん
LONERさん

次の方法で呼び出せるらしい。
Declare Function 関数名 Lib "DLL名" Alias "API名" (引数…) As 戻り値の型次の文は、Excel VBA のスペースインベーダで使われているコード。
Private Declare Function IsBadCodePtr Lib "Kernel32.dll" (ByVal FunctionPointer As Long) As Long
Kernel32.dll 内 の IsBadCodePtr という関数を呼び出している。msdnには、
BOOL WINAPI IsBadCodePtr(
__in FARPROC lpfn
);
とあり、BOOL型。なぜ Long?????? 引数は、"A pointer to a memory address" とのこと。
If the calling process has read access to the specified memory, the return value is zero.
If the calling process does not have read access to the specified memory, the return value is nonzero. To get extended error information, call GetLastError.
If the application is compiled as a debugging version, and the process does not have read access to the specified memory location, the function causes an assertion and breaks into the debugger. Leaving the debugger, the function continues as usual, and returns a nonzero value. This behavior is by design, as a debugging aid.
アクセス可能なら 0 を返し、アクセス不可能なら GetLastError を実行する。GetLastError で エラーコード を取得できるらしい。そんで、Long のナゾだけど、IsBadCodePtr の入っている winbase.h を見ると、確かに BOOL と書いてある。そこで、そのBOOLの書かれているドキュメント(WinDef.h)を見ると、typedef int BOOL; と書いてある。つまり、BOOL とありながらも 実態は int ということだ。typedef は、型にエイリアスをつけるための宣言。
typedef は、typedef int size; のように使う。int ならはっきり int と書いたほうがいいような気もするけど・・・使いやすいのか? typedef int size を typedef double size に変更すれば、size と書いてあるところ全部が double になるので、そういう時には便利なのかもしれない。しかしそんな型を変えることってあるのだろうか? わからん。
http://msdn.microsoft.com/en-us/library/aa366712%28v=vs.85%29.aspx
Private Declare Function DispCallFunc Lib "oleaut32.dll" (ByVal VtblObject As Long, ByVal FunctionOffset As Long, ByVal CallConv As Long, ByVal ReturnType As VBA.VbVarType, ByVal ArgsCount As Long, ByRef ARefArgsType As Integer, ByRef ARefArgs As Long, ByRef RefResult As Variant) As Long
つ~ぎ~は~ DispCallFunc。残念なことに、今このタイミングで、msdn のサーバがダウンしている。誰かのブログを検索してもいいのだけれど、やはり一次ソースは見ておくべきだろう。つづく・・・
Private Declare Function GetDIBits Lib "gdi32" (ByVal hdc As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As LPEC_BitMapInfo, ByVal wUsage As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)
LONERさんのブログ一覧