hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。 |
Visual C++を使ったDLLの作成方法についての解説です。
マニュアル(HSPDLL.TXT)もサンプルもVisual C++を前提としているので他の言語に比べ導入もしやすいと思います。
用意するもの
入手:Hot Soup Processor SDK ver3.1
プラグインを作るのに必要な、マニュアルとサンプル、ヘッダファイルなどを含んでいます。
必ず入手してください。
ダウンロードしたら適当なフォルダに解凍しておきましょう。後から動かす必要のないような場所においておくといいです。
ここでは、Visual C++ 2008 Express Editionを使用します。
↓ここからフリーで入手・使用することが出来ます。ダウンロードしてインストールしておいてください。
http://www.microsoft.com/japan/msdn/vstudio/Express/
ダウンロードしたら適当なプログラムでも組んで操作になれておきましょう。
HSP3SDKにはたくさんのサンプルが含まれていますが、代表的なサンプルhpi3sampleをビルドしてみます。
<HSPSDKインストールフォルダ>\hspsdk31\sample\hpi3sample
上記のフォルダを開いて、hpi3sample.vcprojをダブルクリックするとVC++が起動します。
自動的に変換作業を行ってくれるので、次へ次へ。
早速ビルドしてみます。
[メニュー]:メニュー → ビルド → ソリューションのビルド
と実行してみてください。
ビルド結果が、「ビルド: 1 正常終了、0 失敗、」と表示されれば成功です。
Debugフォルダにhpi3sample.dllが作成されているはずです。
hpi3sample.asをhpi3sample.dllと同じ場所に置いてください。
hpi3sample.asを実行してエラーが出なければ成功です。
VC++でDLLを作成すると、関数名が名前修飾されもとの名前とは違うものに変更されます。
ヘルプブラウザの#regcmdの項目にも説明がありますね。
例:
#regcmd "_hsp3cmdinit@4","hpi3sample.dll"
このように記述するわけですが、この「@4」が本当に「@4」なのか確認してみます。
関数名の変更後の名前を調べるには、dumpbin.exeを使用します。
実行は、Visual Studio ToolsのDOS窓から行う必要があります。
スタート → Visual C++ 9.0 Express Edition → Visual Studio Tools → Visual Studio 2008 コマンド プロンプト
として、Visual Studio ToolsのDOS窓を開いてください。
次のように入力します。
dumpbin.exe /exports ???.dll
DLL名のところに、調べたい対象のDLLファイルを指定します。
... ordinal hint RVA name 1 0 0001114A _hsp3hpi_init@4 ...
「_hsp3hpi_init@4」これが名前修飾された後の名前です。
名前修飾はモジュール定義ファイル(.def)を作れば、名前修飾を回避することも出来ます。
【注意】
通常のコマンドプロンプトからdumpbin.exeを実行すると、mspdb80.dllが無いというエラーメッセージが表示され使えません。
dumpbin.exeと同じフォルダにmspdb80.dllをコピーしておけばdumpbin.exeは実行できるようになりますが、
ビルドが成功しなくなるようです。
このような方法はとらないよう注意してください。
C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\dumpbin.exe
C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\mspdb80.dll
まず、ファイルを用意します。これは最初は中身は空のテキストファイルです。
画像つきの説明はこちらの外部サイトの説明がわかりやすいですので参考にして下さい。
次に作成したdefファイルの中身を編集します。 書式は次のようになっています。
;コメント LIBRARY [dll名] EXPORTS [関数名] ...
これもこちらの外部サイトの説明がわかりやすいですので参考にして下さい。
例えばdll_test.dllというdllファイルを作成し、この中にはTashizanという関数がある場合で説明してみます。 なおTashizan関数はint型2つを引数として、足し算した結果の値をint型で返します。
と、いうような条件でHSPでDLLを利用する場合は次のようにします。
1 2 3 4 |
|
関数が値を返さない場合は、#cfuncではなく、#funcを使います。