コンテンツにスキップ
メインメニュー
メインメニュー
サイドバーに移動
非表示
案内
メインページ
最近の更新
未作成ページ
おまかせ表示
ヘルプ
MonoBook
検索
検索
ログイン
個人用ツール
ログイン
ログアウトした編集者のページ
もっと詳しく
投稿記録
トーク
「
DLL
」を編集中
ページ
議論
日本語
閲覧
編集
ソースを編集
履歴表示
ツール
ツール
サイドバーに移動
非表示
操作
閲覧
編集
ソースを編集
履歴表示
全般
リンク元
関連ページの更新状況
特別ページ
ページ情報
2013年8月22日 (木) 11:01時点における
imported>MikeCAT
による版
(リンクを追加)
(
差分
)
← 古い版
|
最新版
(
差分
) |
新しい版 →
(
差分
)
警告: このページの古い版を編集しています。
公開すると、この版以降になされた変更がすべて失われます。
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。
スパム攻撃防止用のチェックです。 けっして、ここには、値の入力は
しない
でください!
'''DLL'''とは、[[Windows]]においてよく使う機能を[[ライブラリ]]にし、一個のファイルにしたものである。 ==DLLの使い方== test.dllのint test(int a)という関数を利用することを考える。 [[静的リンク]]の利点は[[プログラム]]が簡単になることだが、欠点はDLLがないと起動できなくなることなので、 拡張機能を提供するには向かない。 逆に、[[動的リンク]]の利点はDLLがなくてもプログラム内で[[エラー処理]]をすればいいことだが、 プログラムが若干複雑になるという欠点がある。 ===[[C言語]]=== ====静的リンク==== 1.[[インポートライブラリ]]を作成する <pre>>pexports test.dll > test.def >dlltool --dllname test.dll --input-def test.def --output-lib libtest.a</pre> 2.プログラムをコンパイルする <source lang="c"> /* usetest.c */ #include <stdio.h> /* DLLに付属のC言語用ヘッダがあれば、それを使うべきである */ __declspec (dllimport) int test(int a); int main(void) { int a; scanf("%d",&a); printf("%d\n",test(a)); return 0; } </source> <pre>>gcc -o usetest.exe usetest.c -L. -ltest</pre> ====動的リンク==== <source lang="c"> /* usetest_d.c */ #include <stdio.h> #include <windows.h> /* 関数ポインタの宣言 */ typedef int (*test_p)(int a); int main(void) { test_p test; HMODULE hDll; int a; /* DLL自体の読み込み */ hDll=LoadLibrary("test.dll"); if(hDll==NULL) { puts("DLL load error!"); return 1; } /* DLL内の関数の読み込み */ test=(test_p)GetProcAddress(hDll,"test"); if(test==NULL) { puts("function test load error!"); FreeLibrary(hDll); return 1; } scanf("%d",&a); printf("%d\n",test(a)); /* DLLの開放 */ FreeLibrary(hDll); return 0; } </source> <pre>>gcc -o usetest_d.exe usetest_d.c</pre> ===[[Hot Soup Processor|HSP]]3=== <pre>;使用するDLLの名前を設定する #uselib "test.dll" ;命令として登録する #func test_o "test" int ;関数として登録する #cfunc test_f "test" int in=0 input in,100,30,100 button goto "命令を実行",*useorder button goto "関数を実行",*usefunc stop *useorder test_o in dialog "stat="+str(stat),0,"命令" stop *usefunc dialog str(test_f(in)),0,"関数" stop</pre> ===[[Microsoft Excel|Excel]]=== <pre>'使用するDLLと関数の宣言 '変数を値渡しする際は、ByValをつけないといけない Private Declare Function test Lib "test.dll" (ByVal a As Long) As Long Sub Auto_Open() Dim rawInput As String Dim inputValue As Long 'xlsファイルのあるディレクトリにあるDLLを使うのに必要 ChDrive ThisWorkbook.Path ChDir ThisWorkbook.Path rawInput = InputBox("aを入力", "DLLサンプル", "0") If rawInput <> "" Then inputValue = Val(rawInput) MsgBox Str(test(inputValue)), vbOKOnly, "戻り値" End If End Sub</pre> 理論上はこれでできるはずだが、一部のDLLは読み込めないようである(後述)。 ===[[Active Basic]] 5=== <pre>#console Declare Function test Lib "test.dll" (a As Long) As Long Dim a As Long Dim result As Long Input a result=test(a) Print result</pre> ==DLLの作り方== [[Visual Studio|Visual C#]]を使用しても[[拡張子]]が.dllの[[ファイル]]は作れるようだが、ここで扱うDLLとは別物のようである。 ===C言語=== <source lang="c"> /* test_dll.h */ #ifndef TEST_DLL_H_GUARD #define TEST_DLL_H_GUARD /* WINAPIマクロを使用するのに必要 */ #include <windows.h> /* おまじない */ #if BUILDING_DLL # define DLLIMPORT __declspec (dllexport) #else # define DLLIMPORT __declspec (dllimport) #endif /* ここにエクスポートしたい関数のプロトタイプ宣言をDLLIMPORTを付けて書く */ /* DLLIMPORTと戻り値の型の間にWINAPIと書かないと、Excel2007では読み込めないようである。 */ /* C言語(静的/動的リンク、gcc4.7.2)およびHSP3.2ではWINAPIがあってもなくても読み込めるようである。 */ DLLIMPORT WINAPI int test(int a); #endif </source> <source lang="c"> /* test_dll.c */ #include "dll.h" /* おまじない */ BOOL APIENTRY DllMain (HINSTANCE hInst,DWORD reason,LPVOID reserved) { return TRUE; } /* このあたりに関数の本体を書く */ DLLIMPORT WINAPI int test(int a) { return a*a+a+1; } </source> <pre>>gcc -static -c test_dll.c -o test_dll.o -DBUILDING_DLL=1 >dllwrap --output-def libtest.def --implib libtest.a test_dll.o --no-export-all-symbols --add-stdcall-alias -o test.dll</pre> この方法ならインポートライブラリも同時に作成してくれるので、使用時に作り直す必要はない。 ===Active Basic 5=== # 新規作成を押す # 「プロジェクト」を選んでOKを押す # プロジェクト名を入力し、「DLL - プロシージャ ライブラリ」を選択して次へを押す # 次へを押す # 完了を押す # 表示されたコードのDllMain関数の定義の下に下記のソースコードを書く # リリース コンパイルを押す <pre>'エクスポートしたい関数のFunction/Subと名前の間にExportと書く Function Export test(a As Long) As Long test=a*a+a+1 End Function</pre> これで作成したDLLもExcel2007で読み込めるようである。 ==関連項目== * [[スタティックリンクライブラリ]] * [[ライブラリ]] * [[クラスライブラリ]]
編集内容の要約:
MonoBookへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MonoBook:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の確認用の質問に回答してください (
詳細
):
1たす1は?(全角で入力してください)
キャンセル
編集の仕方
(新しいウィンドウで開きます)
本文の横幅制限を有効化/無効化