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

#挨拶
　はじめましての方は初めまして。あめふりてる*です。
　この記事は、[TCU-CTRL場外乱闘 Advent Calendar 2020](https://adventar.org/calendars/5080)の記事です。
　昨日は、コットンさんの「[敗北を知った就活生の話](https://cottontraveler.hateblo.jp/entry/2020/12/11/223513#%E9%95%B7%E6%9C%9F%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%AE%E3%82%B9%E3%82%B9%E3%83%A1)」でした。就活の厳しさを肌にきざんでくるような記事でした。自己分析ぃ…ですかねぇ。
　
　さて、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](https://visualstudio.microsoft.com/ja/vs/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562969/2e71028c-f697-da8b-cdd8-7bf95a3cb369.png)
ダウンロードが終わったら、実行しましょう。実行すると以下のような画面が出てくるので「続行」を押しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562969/ae8365df-46c4-3ddf-7b1c-16baf0394180.png)
以下の画面が出てきたら、「C++によるデスクトップ開発」にチェックを入れ、右下のインストールを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562969/647f9fbf-a0aa-8155-0b6f-21deec98e1da.png)
以下の画面で時間がかかるので、気長に待ちましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562969/b646a0aa-6731-f1af-5aa5-ea319af73251.png)
インストールが終わるとVisual Studio 2019が立ち上がります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562969/abbe073b-4d29-02a3-4d60-daa7bb578a4a.png)
これで、Visual Studio 2019のインストールは完了しました。

##2.HSP3のインストール

HSP3のインストールに関しては、「[HSP3最新版のインストール方法](https://qiita.com/AmefuriTell/items/ddabac3cea76035cfc74)」を参照してください。

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

初めに、[DELL_FOR_HSP.zip](https://drive.google.com/uc?id=15QgeAp-als4fCpaG0v04ggihuk5DAGG3&export=download)をダウンロードします。
ダウンロード出来たら、エクスプローラーを開き、```C:\User\<ユーザーの名前>\ドキュメント\Visual Studio 2019\Templates\ProjectTemplates\```の中にコピーします。私の場合、ユーザー名が「作業場」なので、```C:\User\作業場\ドキュメント\Visual Studio 2019\Templates\ProjectTemplates\```の中にコピーすればよいことになります。以下の画像のようになっていたらOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562969/0834ac63-a069-7898-7016-d8f9e44aac0c.png)

Visual Studio 2019を立ち上げて、新しいプロジェクトの作成を開き、テンプレートの下のほうに「DLL_FOR_HSP」が生成されていたらインストール完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562969/3d07026e-f111-c55f-98ac-8674e6d4828c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562969/49242212-a78e-51f5-720b-34c81c853d13.png)


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

#2.DLLを作る

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

##1.プロジェクトを作成する
Visual Studio 2019を立ち上げて、新しいプロジェクトの作成を開き、「DLL_FOR_HSP」を選択して、右下の次へを押します。
次に、プロジェクト名と場所を入力し、作成を押します。今回私は、画像のようにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562969/4a1b2975-9c09-949f-1503-3e1bcc75214a.png)

##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に変更し、上タブのビルドから、ソリューションのビルドを選択しビルドします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562969/c4cb5761-5a0d-dd5b-e9da-2357c3afeacc.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562969/7e416b6f-14fc-c12d-b899-94ce49739793.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562969/663d6405-2c8b-ce4c-23e4-72f90eab2b0b.png)


エラーが出なければビルドが成功しています。ソリューションフォルダを見ると、Module.defで指定した名前のDLLが出来上がっています！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562969/0a02ac3e-bb62-ce15-2bcf-f21bb25f4515.png)

#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

```

すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562969/02dda98f-48db-9b33-7761-73ea3d5e08a5.png)

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

#4.最後に
ここまで読んでいただき、ありがとうございました！
HSP用のDLLを作ることはなかなかハードルが高いですが、この記事で少しでもハードルを下げることができていたら幸いです。
DLLをもっと書いてみたいという人は、[公式のプラグイン開発マニュアル](http://www.onionsoft.net/hsp/v35/hspsdk/hspdll.txt)を読んでみるとまた、新しい自分の可能性が出てきます！ぜひ読んでみてください！

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