HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0802
きのよーDLLを読み込むときの仕様とか、DLL関連について8解決


きのよー

リンク

2014/8/2(Sat) 01:36:47|NO.63299

C++の基礎をあまり理解せずにDLLを作ろうと思っています、そこから間違いとは言わないでくださいお願いします……。
色々なサイトでC++でDLLを作る方法を見ますが、どれもクラスを作って関数を書き、それをエクスポートしています。
動的にDLLを読み込んで呼び出すときもそのクラス名を記述しています。

となると、HSPがコンパイルしたプログラムでDLLを呼び出すとき、クラスは書かなくても良いのでしょうか?
多くのDLL(今まで見てきたDLL)はすべてクラス名なしで直接関数の名前を指定しています。
しかし、上記の通り色々なサイトではクラスを作って関数を作り、呼び出し側もそれを考慮しなければなりません。
DLLの呼び出しがどのようになっているのか、誰かご教授をお願いします。
また、場違いではありますがC++でDLLを作る方法も、できれば教えていただきたいです。



この記事に返信する


MonoChrome

リンク

2014/8/2(Sat) 01:59:28|NO.63300

C++でHSP用のDLLを作る方法は過去ログにありますね
http://hsp.tv/play/pforum.php?mode=pastwch&num=22578



きのよー

リンク

2014/8/2(Sat) 02:38:17|NO.63301

MonoChrome様、ご回答有難うございます。

>>C++でHSP用のDLLを作る方法は過去ログにありますね
こちらの記事を参考にしてVS2013Expressを使ってやってみました。
しかし、
・「モジュール定義ファイル」の作成がない
・「64bit移植への対応」項目が見つからない
・「ランタイムライブラリ」項目が見つからない
・ビルドは正常終了しているのにDLLが生成されていない
見る限りこの4つ相違点がありました。他にもあるかもしれません。
どのようにすれば解決できるでしょうか……?



MonoChrome

リンク

2014/8/2(Sat) 05:40:27|NO.63302

>>「モジュール定義ファイル」の作成がない
カテゴリを「VisualC++」→「コード」で拡張子を「.def」にして作成するみたいです。
作成した後はプロジェクトのプロパティを開いて
「構成プロパティ」→「リンカー」→「入力」の「モジュール定義ファイル」で作成したファイルを指定してください。

>>「64bit移植への対応」項目が見つからない
自分もどこにあるのか見つけられませんでしたが設定しなくても問題なさそうです。

>>「ランタイムライブラリ」項目が見つからない
プロジェクトのプロパティを開いて
「構成プロパティ」→「C/C++」→「コード生成」の中にあります。


上記の設定を行った後プロジェクトをリビルドしてみてください。
プロジェクトフォルダ内の「Debug」フォルダの中にdllが生成されているはずです。



skyblue

リンク

2014/8/2(Sat) 09:53:01|NO.63306

>・「64bit移植への対応」項目が見つからない
そもそもexpressでは作成できないので関係なし(基本は)
さらに言えば、HSPは32bitのみなので64bitに対応する必要がない



きのよー

リンク

2014/8/2(Sat) 11:37:14|NO.63307

皆様、ご回答有難うございます。

MonoChrome様
>>カテゴリを「VisualC++」→「コード」で拡張子を「.def」にして作成するみたいです。
>>作成した後はプロジェクトのプロパティを開いて
>>「構成プロパティ」→「リンカー」→「入力」の「モジュール定義ファイル」で作成したファイルを指定してください。
モジュール定義ファイルが見つからなかったため、その方法でdefファイルを作成しました。
>>プロジェクトのプロパティを開いて
>>「構成プロパティ」→「C/C++」→「コード生成」の中にあります。
プロジェクトのプロパティ→「構成プロパティ」の下に「C/C++」の項目がありません。
「全般」「デバッグ」「VC++ディレクトリ」「リンカー」「マニフェスト ツール」「XML ドキュメント ジェネレーター」
「ブラウザー情報」「ビルドイベント」「カスタム ビルド ステップ」「コード分析」
の項目がありますが、どの項目にも「コード生成」がありません。
プロジェクトの生成方法を間違えたのでしょうか……?

skyblue様
>>そもそもexpressでは作成できないので関係なし(基本は)
>>さらに言えば、HSPは32bitのみなので64bitに対応する必要がない
Expressでは作成できないのですね。通りでプロパティがないと思いました……。
確かにHSPが32bitなので64bitにする必要はありませんね。参考になりました。



check

リンク

2014/8/2(Sat) 11:54:27|NO.63308

VS2012の方法なので2013だと変わっているかもしれないが……

起動する→新しいプロジェクト→Visual C++→Win32 Project→DLLを
空のプロジェクト選択してプロジェクトを作成する。

メニューのプロジェクト→新しい項目を追加を選択し、適当な名前のC++ファイルを作成する。
その後、自分のやりたい事を行う関数を作成する。

例:

・C++側(addtest.dllを作成) #define EXPORT extern "C" __declspec(dllexport) EXPORT int add_func(int a, int b) { return a + b; } ・HSP側 #uselib "addtest.dll" #cfunc add_func "add_func" int, int mes add_func(10,20)



きのよー

リンク

2014/8/2(Sat) 11:54:35|NO.63309

追加の情報ですが、よく見たところ出力のログが、

1>------ ビルド開始: プロジェクト:nohDLL, 構成:Debug Win32 ------ ========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========
これで終わっていました。
つまり、何も処理をされずに正常終了の値が返ってるということになります。
ビルドどころか解析すらされていない……?



きのよー

リンク

2014/8/2(Sat) 12:19:43|NO.63311

check様、ご回答有難うございます。

ご紹介された方法で作成したら、問題なく動作しました。
やはり__declspec(dllexport)でエクスポートすることが一番無難なのですね。
しかし、その他のコードが一切ないのにできてしまうとは……驚きです。
また、extern "C"というキーワードもあるのですね。初めて知りました。
簡単な方法をご教授いただきありがとうございます。

……と、check様の方法でビルドできたので、今回はこの方法を用いてDLLを作成したいと思います。
しかし、他にももっと方法があれば、そちらも参考にしたいと思いますので、
解決にチェックを入れますがご回答をお待ちしています。



ONION software Copyright 1997-2021(c) All rights reserved.