Visual Studio 2019を使ったHSP3用のDLL作成法


挨拶

 はじめましての方は初めまして。あめふりてる*です。
 この記事は、TCU-CTRL場外乱闘 Advent Calendar 2020の記事です。
 昨日は、コットンさんの「敗北を知った就活生の話」でした。就活の厳しさを肌にきざんでくるような記事でした。自己分析ぃ…ですかねぇ。
 
 さて、12日目の今日は、HSP3でのDLLの作り方と使い方の初歩の初歩 についての記事です。

 この記事を書く経緯ですが、HSP用のDLLの作り方を調べると、ほとんどがVisual Studio 2010や2008を使っています。これでは、今作ってみたいと思っている人の環境構築が大変です。そこで、2020年12月現在最新バージョンのVisual Studio 2019を使用することで、環境構築のハードルを下げてしまおうと思いたちました。これが、経緯です。
「C++は書いたことあるけど、HSPは書いたことないなぁ」という人向けにもなるかと思っております。

0.注意事項

 この記事は、C/C++で簡単な関数が書けるという人向けに書いています。そのあたりが怪しいなと思った方は、C/C++の関数をおさらいしてからまた読み直してみてください。
 そして、この記事はWindows環境であることを前提として書いています。あらかじめご了承ください。

1.環境構築

この章では、必要なもののダウンロードをします。

必要なものは以下の通りです。
1.Visual Studio 2019のインストール
2.HSP3
3.HSP用DLL開発用テンプレートのインストール

ひとつずつダウンロードしていきましょう。

1.Visual Studio 2019のインストール

初めにVisual Studio Community 2019をダウンロードします。
Visual Studio 2019

ダウンロードが終わったら、実行しましょう。実行すると以下のような画面が出てくるので「続行」を押しましょう。

以下の画面が出てきたら、「C++によるデスクトップ開発」にチェックを入れ、右下のインストールを押します。

以下の画面で時間がかかるので、気長に待ちましょう。

インストールが終わるとVisual Studio 2019が立ち上がります

これで、Visual Studio 2019のインストールは完了しました。

2.HSP3のインストール

HSP3のインストールに関しては、「HSP3最新版のインストール方法」を参照してください。

3.HSP用DLL開発用テンプレートのインストール

初めに、DELL_FOR_HSP.zipをダウンロードします。
ダウンロード出来たら、エクスプローラーを開き、C:\User\<ユーザーの名前>\ドキュメント\Visual Studio 2019\Templates\ProjectTemplates\の中にコピーします。私の場合、ユーザー名が「作業場」なので、C:\User\作業場\ドキュメント\Visual Studio 2019\Templates\ProjectTemplates\の中にコピーすればよいことになります。以下の画像のようになっていたらOKです。

Visual Studio 2019を立ち上げて、新しいプロジェクトの作成を開き、テンプレートの下のほうに「DLL_FOR_HSP」が生成されていたらインストール完了です。

これで、環境構築は終了です。

2.DLLを作る

さて、環境構築が終わったので実際にDLL作って動かしてみましょう。

1.プロジェクトを作成する

Visual Studio 2019を立ち上げて、新しいプロジェクトの作成を開き、「DLL_FOR_HSP」を選択して、右下の次へを押します。
次に、プロジェクト名と場所を入力し、作成を押します。今回私は、画像のようにしました。

2.main.cppに関数を書き加える

プロジェクトができたら、main.cppに関数を書き加えます。
今回は、入力された整数を二倍にする「IntNibai」と、入力された実数を二倍にする「FloatNibai」という関数を作ります。main.cppの一番下に行き以下のコードを書き加えます。

main.cpp
/*------------------------------------------------------------*/
/*
        以下メイン
*/
/*------------------------------------------------------------*/
bool WINAPI IntNibai(int *num)
{
    *num *= 2;
    return 0;
}

bool WINAPI FloatNibai(double *num)
{
    *num *= 2;
    return 0;
}

HSPで扱うための関数は、

型名 WINAPI 関数名(引数){処理}

で書かれます。型名と関数名の間に、「WINAPI」を入れましょう。

私もまだまだ勉強不足ですが、結果を格納する変数をポインタで受け取ることをおすすめします。
HSPで、整数型以外を戻り値にすると、正確に受け取ることができないことがあるためです。

3.Module.defを書き換える

関数が書き終わったら、Module.defを書き直しましょう。

Module.def
LIBRARY "ExportDll"

EXPORTS
    IntNibai    @1
    FloatNibai  @2

Module.defは、

LIBRARY "DLLの名前"

EXPORTS
    関数名1    @1
    関数名2    @2
    関数名3    @3
    ....

という風に書いていきます。関数が増えるたびに、@のあとの数字は1から順に割り当てていきます。

4.ビルドする

ソリューションの構成をDebugからReleaseに変更し、上タブのビルドから、ソリューションのビルドを選択しビルドします。

エラーが出なければビルドが成功しています。ソリューションフォルダを見ると、Module.defで指定した名前のDLLが出来上がっています!

3.DLLを使ってみる

先ほど作成したDLLを使ってみましょう。
ソリューションフォルダ(私だったら、MAKE_DLL_TEST)に、「test.hsp」というファイルを作り、以下のコードを入力します。

test.hsp

#uselib "ExportDll.dll"

#func seisuu_nibai "IntNibai" var
#func jissuu_nibai "FloatNibai" var

a = 2
b = 0.6

seisuu_nibai a
jissuu_nibai b

mes a
mes b

すると、

見事、入力の2倍の数字になりました!
これにて、この記事でするべきことは全て達成しました!

4.最後に

ここまで読んでいただき、ありがとうございました!
HSP用のDLLを作ることはなかなかハードルが高いですが、この記事で少しでもハードルを下げることができていたら幸いです。
DLLをもっと書いてみたいという人は、公式のプラグイン開発マニュアルを読んでみるとまた、新しい自分の可能性が出てきます!ぜひ読んでみてください!

この記事を気に入っていただけたらぜひ、ストックやLGTMをお願いします。また、質問やご意見も募集してます。
では、またどこかで。