ゲーム制作ツール RPGツクール全般 【RGSS】DLLを作ろう【導入編】


タグ: 

This topic contains 1件の返信, has 1件の返信, and was last updated by  半生 9 年 3 ヶ月.

  • abstract

    1. ツクールを買います
    2. とりあえず無料のVisualStudio2013Communiyをダウンロードします(もうすぐVS2015がでますん)
    3. VS2013でDLLを作ります
    4. ツクールで読み込んで使用します。
    5. ね。簡単でしょう?

      対象想定

    • RGSSからAPI呼び出したことがある。がんばれば出来そう
    • C言語入門をちらみしたことがあるかもしれない

      とりあえず今回は開発環境の準備。なんかよく分からんけどDLL作れたくらいを目標に。  

    ソイソース

    VisualStudioダウンロード

    https://www.visualstudio.com/ja-jp/downloads/download-visual-studio-vs.aspx ここの

    Visual Studio Community 2013 Update 4で

          言語パックもいれとくといいかも     

    プロジェクト作成

    1. VisualStudio起動
    2. 新規作成=>プロジェクト
    3. VisualC++のWin32プロジェクトを選択
    4. 名前とソリューション名はとりあえず”tktk”でmake_dll01
    5. 種類:DLL. オプション:空のプロジェクト、SDLはとりあえずオフでmake_dll02
    6. ソースにsample.cpp. ヘッダーにsample.h突っ込む
    7. ビルド=>ソリューションのビルドでDLLが出来ますん(プロジェクトフォルダのDebug辺り)

      このままだと特定のCRT(C言語系のランタイム)が入っていないと動かないDLLになっちゃうので 構成プロパティ>C++>コード生成>ランタイムライブラリ>をMTにしとくとよさげです

    make_dll03

      とりあえず DLLから数値を返すメソッド DLLないで引数をかけ算して返すだけのメソッド ですん  

    omake

    大昔書いたデバッグウインドウのソース。色々きたない。

  • 前回のソースの解説みたいなの  

    sample.h

    extern "C"{
     __declspec(dllexport) int Version(void);
     __declspec(dllexport) int Calc(int, int);
    }

    関数の定義とマングリング防止のおまじないです。※マングリング:cppのコンパイラでコンパイルすると名前が複雑に変換されてしまう。(オーバーライド等があるため)

    sample.cpp

    #include 
    #include "sample.h"

    ヘッダファイルの取り込みウィンドウズもろもろとさっきのヘッダ。 Pathを「<>」で囲むとデフォルトのパスから。ダブルクォーテーションで囲むとファイルのパスから探すようになります。

    BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
    {
     switch (fdwReason)
     {
     case DLL_PROCESS_ATTACH:
     break;
    case DLL_PROCESS_DETACH:
     break;
    case DLL_THREAD_ATTACH:
     break;
    case DLL_THREAD_DETACH:
     break;
     }
     return TRUE;
    }

    DLLを組み込んだときとか解放するときに呼ばれる関数です。とりあえず書いときましょう。 関数呼び終わったら大体すぐDLLの解放処理が呼ばれますが走でないときもあります。変数のスコープ等には注意しましょう。 ツクールを×ボタンで終了したときとかは呼ばれないこともまれによくあるので最後に必ず実行しないと逝けない処理とかはここに依存しない方がいいです。  

    /* 整数をだけの関数 */
    int Version(void)
    {
     return 838861;
    }

    数字を返してるだけです。バージョンとかリビジョンとか返すようにしてると後々助かることもあるかも。  

    /* 引数二つをかけて返すだけ */
    int Calc(int x, int y)
    {
     return x * y;
    }

      引数二つをかけ算して返してるだけです。   入出力が数値だけですむなら大体こんな感じで逝けます。

     

    文字列等の数値以外の型はポインタとか参照とか呼ばれるメモリ上の住所に当たる数字を指定したり返したりします。その辺は次回

このナレッジに返信するにはログインしてください。