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


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0109
f(浮気中)DLLの作り方とHSPでの呼び出し方。24解決


f(浮気中)

リンク

2009/1/9(Fri) 22:17:54|NO.22578

最近、DLL云々の話が多いな。

俺はHSPはWindowsの面倒な決まりごとや手順を引き受けて、簡単にコーディングさせてくれる物と思って

いるが、
敢えてクソ面倒くさい事を承知の上でHSPでは実現の面倒な処理をC言語で書いて見たいと言うのなら、手

順を書いて差し上げよう。
VS2008のExpressEditionならタダで手に入る。


とりあえず俺はVS2005を主に使ってるので、それを前提に話を進める。

・プロジェクトを作る
VSを立ち上げたら、まずは新しいプロジェクトを作る。

VisualC++ > Win32プロジェクト
ここで開発用のディレクトリと、プロジェクト名も決めておく。

次にアプリケーションウィザードで選ぶのは、

アプリケーションの種類 -> DLL
追加のオプション    -> 空のプロジェクト

コレで完了にする。



この記事に返信する


f(浮気中)

リンク

2009/1/9(Fri) 22:18:15|NO.22579

・必用なソースファイルを作る
ソリューションエクスプローラの「ソースファイル」上で右クリック。
追加->新しい項目 から、カテゴリをVisualC++->コードにして、適当な名前でソース用の「c++ファイル

」を作る。

・モジュール定義ファイルを作る
ソリューションエクスプローラの「ソースファイル」で右クリックし、
追加->新しい項目 から、カテゴリをVisualC++->コードにして、適当な名前で「モジュール定義ファイ

ル」を作る。

・プロジェクトの設定を変更する
メニューの「プロジェクト(p)」から、
 構成プロパティ->全般 の中の、
 文字セットを「マルチバイト文字セットを使用する」に変更する。
  UNICODEでいいなら変更しなくて良い。

同じく、構成プロパティ->C/C++->全般 で、
 64bit移植への対応 を いいえにする。
  対応する気があるなら然るべき設定に。

さらに構成プロパティ->C/C++->コード生成 で、
 ランタイムライブラリをマルチスレッド(/MT)に変更する。
 やっとかないと、初期のXPやそれ以前のwindowsでは「DLLが無い!」とか言って起動しない。



f(浮気中)

リンク

2009/1/9(Fri) 22:18:31|NO.22580

・DLLのエントリーを書く
最初に作った、ソース用ファイルを開き、

//------------------------------------------------------------------------------- // DLLエントリー //------------------------------------------------------------------------------- BOOL APIENTRY DllMain( HINSTANCE hInstance , DWORD fdwReason , PVOID pvReserved ) { switch( fdwReason ) { case DLL_PROCESS_ATTACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: break; } return TRUE; }
と記述する。DLLが使われる事になったら、まずココが呼び出される。
正式に書くならこんな感じだが、大げさに使う気が無いなら

BOOL APIENTRY DllMain( HINSTANCE hInstance , DWORD fdwReason , PVOID pvReserved ) { return TRUE; }
これで十分だ。

おっと、

#include <windows.h>
を先頭に付けとけよ。



f(浮気中)

リンク

2009/1/9(Fri) 22:18:51|NO.22581

・DLLで呼び出したい関数を作る。

INT WINAPI nibai( int param ) { INT result; result = param * 2; return result; } INT WINAPI gobai( int param ) { INT result; result = param * 5; return result; }

型指定のあとに、WINPAIと付けとく。

・モジュール定義ファイルに設定を書き込む。

LIBRARY "test" EXPORTS nibai @1 gobai @2

LIBRARY の所は、モジュール定義ファイルを作った時に勝手に入っている。
EXPORTS以降を書き込む。「@数字」の所は連番にしておく。

・ビルドする。
プロジェクトを作ったフォルダ以下のreleaseフォルダの中にDLLファイルが出来ていたら完成だ。



f(浮気中)

リンク

2009/1/9(Fri) 22:19:11|NO.22582

・HSPでDLLを使えるようにする。
まず、DLLを使う事をHSPに教える

#uselib "test.dll"

次に、関数を定義する

#cfunc nibai "nibai" int #cfunc gobai "gobai" int

#cfuncの次のが、HSPで呼び出す時の名前で、"で区切られた名前がDLLの関数の名前だ。

・HSPでDLLを使う

#cfuncで作った関数は、必ず返値があるので、受け取る変数を用意しておく。


ret = nibai( 10 )

関数なので、当然このようにも書ける。

mes gobai( 10 )



f(浮気中)

リンク

2009/1/9(Fri) 22:19:29|NO.22583

・注意事項
VSと過去に作ったDLLを見ながらちょいちょいと書いた物なので、
実際にこのDLLは作ってない。当然動作確認もしてない。

多分大丈夫だと思うが、駄目だったら突っ込んどいてくれ。



Trip

リンク

2009/1/9(Fri) 22:36:32|NO.22586

うーん、これにしたがって行ったのですが
やっぱりマニフェストがどうのこうの言ってきます。
もう、マニフェストファイルは生成しないようにしてもいいのですか?



f(浮気中)

リンク

2009/1/9(Fri) 22:38:18|NO.22587

そもそも、lunaを使うようなDLLなのか?
フォームもボタンも表示しないなら、そんなの要らないぞ?



f(浮気中)

リンク

2009/1/9(Fri) 22:39:01|NO.22588

つか、向こうにも貼ったが、
http://www.g-ishihara.com/vc_wi_01.htm
は見たの?



Trip

リンク

2009/1/9(Fri) 22:42:20|NO.22589

>http://www.g-ishihara.com/vc_wi_01.htmは見たの?
みました。
マニフェストなのですけど、
プロパティから生成しないを選んだら勝手に作ってくれました。
ですが、肝心のDLLがないのですが・・・
releaseフォルダすらありません。



f(浮気中)

リンク

2009/1/9(Fri) 22:43:51|NO.22590

ビルドしないと、出来てないと思うよ。
成功しないとDLLも出来てないと思うが。



Trip

リンク

2009/1/9(Fri) 22:50:19|NO.22592

ビルドしましたら、
mt.exe : general error c10100b1: Failed to load file "..\Release\hspdll2.dll". U _Q9L dK
とまたジェネラルエラーがでます。
というかmt.exeって何なのですか?



f(浮気中)

リンク

2009/1/9(Fri) 23:04:04|NO.22593

実行ファイルからマニフェストを抽出したり埋め込んだりするツールの様だな。
DLLファイルが出来てないから「ファイルが無い」とエラーを出してるんだろう。



f(浮気中)

リンク

2009/1/9(Fri) 23:22:53|NO.22594

2chのここによると、
http://pc11.2ch.net/test/read.cgi/gamedev/1159998619/479-532


■エラー内容
通訳?すると、ビルドする対象が存在しないためビルドに失敗しました、です。

と言う事のようだが。



f(浮気中)

リンク

2009/1/10(Sat) 00:20:33|NO.22597

しょうがないので実際にDLLを作ってみたが、問題なく動作するな。
これがビルドログだ。



------ ビルド開始: プロジェクト: test2, 構成: Release Win32 ------
コンパイルしています...
test.cpp
リンクしています...
ライブラリ C:\Documents and Settings\*****\My Documents\Visual Studio 2005\_
Projects\test\Release\test.lib とオブジェクト _
C:\Documents and Settings\*****\My Documents\Visual Studio 2005\_
Projects\test\Release\test.exp を作成中
コード生成しています。
コード生成が終了しました。
マニフェストを埋め込んでいます...
ビルドログは "file://c:\Documents and Settings\*****\My Documents\Visual Studio 2005\_
Projects\test\test\Release\BuildLog.htm" に保存されました。
test2 - エラー 0、警告 0
========== ビルド: 1 正常終了、0 失敗、0 更新、0 スキップ ==========



f(浮気中)

リンク

2009/1/10(Sat) 00:21:05|NO.22598

ちょいと横幅のあるのを書き込んでしまったら、こんなことに・・・



GENKI

リンク

2009/1/10(Sat) 01:24:22|NO.22600

ちょっとやってみました。
【環境】
Vista
Visual C++ 2008 Express Edition


> ・モジュール定義ファイルを作る
> ソリューションエクスプローラの「ソースファイル」で右クリックし、
> 追加->新しい項目 から、カテゴリをVisualC++->コードにして、適当な名前で「モジュール定義ファイ
> ル」を作る。

ここでは「モジュール定義ファイル」の項目が見当たりませんでした。
とりあえず適当な名前(test.def)でファイルを作成してみました。
当然真っ白でした。

> LIBRARY "test"

仕方ないのでソースをコピペ。
LIBRARYはとりあえず適当にプロジェクト名を入れてみました。(これでいいのかな?)

モジュール定義ファイルを登録しないといけないようなので、
メニューの「プロジェクト(p)」から、
 構成プロパティ->リンカ の中の、
 モジュール定義ファイルにさっき作ったファイル名「test.def」を入力。

と、こんな感じでビルドしてみたら上手くdllファイル作ってくれました。
HSPからの呼び出しも成功です。

試しに「モジュール定義ファイル」なしでビルドしてみたら何の問題も無くdllが作成されました。
HSPからの呼び出しには失敗しましたが。(ERR38)

ちょっと検索してみたところ、ExpressEdition(フリー版)だとモジュール定義ファイルは自動で作れないようです。



ANTARES

リンク

2009/1/10(Sat) 01:53:37|NO.22601

 浮気中さんのレジメを追試しようとしたが、途中でわからなくなったので断念。
モジュール定義ファイルって何?

 で、別のレジメ。
1 VC2008EEを起動
2 スタートページを閉じる
3 ファイル→新規作成→プロジェクト
4 「Win32」をクリック
5 「Win32 プロジェクト」をクリック
6 プロジェクト名:testdll2
7 「ソリューションのディレクトリを作成」のチェックを外す
8 場所は「C:\VcProject」になっていたのでそのままにする
9 OK
10 「アプリケーションの設定」をクリック
11 DLL (D)をクリック
12 完了
13 エディタに入力
#include <direct.h>

#define EXPORT extern "C" __declspec (dllexport)

EXPORT BOOL WINAPI deletedir(char* dir,int p2,int p3,int p4)
{
return _rmdir(dir);
}
14 F7キーを押す
Debugフォルダにtestdll2.dllがでけた。
15 testdll2.dllをよそのフォルダに持っていって以下のスクリプトを実行。
動かん(T_T)
「DLLの呼び出しに失敗しました」
16 自前のPEアナライザでtestdll2.dllのエクスポート関数を調べる
「_deletedir@16」と表示されたので問題なし
17 スクリプトを見直す
DLL名が間違ってやんの
18 DLL名修正
「ファイルが見つからないか無効な名前です」
DLL名を間違えてても出ないエラーがDLL名を正しくしてから出るとは?
19 エラーメッセージをよく見る
おや、DLL名が書いてある2行目ではなく5行目の「makedir」でエラーが出ている。
そうか、さっきできたフォルダが残っているので作れないと言ってるのか。
20 さっきできたフォルダを削除
動いた

#uselib "testdll2.dll" #func deldir deletedir 1 dir="testdir" mkdir dir dialog dir+"フォルダができていることを確認してください" deldir dir end



f(浮輪中)

リンク

2009/1/10(Sat) 08:20:10|NO.22603

突っ込み有り難くm(__)m

ExpressEditionでは、標準でモジュール定義ファイル作れないのか。
これを作っておくとC側で「extern]やら「__declspec」の修飾要らないし、
HSP側で「_関数名@16」とかの「_」や「@16」が要らないのだが。

まあ、HSP側のほうは"で囲まなきゃ良い事だが、文字列囲まずに二つ並べるのが、なんか嫌な感じでな。



Trip

リンク

2009/1/10(Sat) 09:42:29|NO.22605

>■エラー内容
>通訳?すると、ビルドする対象が存在しないためビルドに失敗しました、です。
>と言う事のようだが。
ビルドする対象が存在しないってどういうことですか?



っち

リンク

2009/1/10(Sat) 12:22:10|NO.22611

つーかこういうスレを作るとSDKも読めない輩が聞けば教えてくれると思って質問しまくる状況になるから、控えてほしいんだが。
C言語はHSPのように安全弁はついてないんだから仮に作者のPCで偶然動いたからってリリースされても困る。

だいたいHSPのエラーメッセージの意味もわからないような連中が、
コンパイラのワーニングやエラーを理解できるとは思えない。

まだXファイルをHSPで作成するほうが許せた。



f(浮輪中)

リンク

2009/1/10(Sat) 14:17:53|NO.22620

ふむ。
それもそうだな。

個人的には、「その内埋もれて、後で過去ログ検索する程度の知恵のある奴が見つけた時に役立つかも試練のう」と考えて居たが。



Hiroaki Software

リンク

2009/1/10(Sat) 16:19:30|NO.22624

f様
>最近、DLL云々の話が多いな。
でその元って僕ですよね?

って決まってるか
自分でスレ立てたのですから

でもこのスレ参考にします(DLLの作成の)



f(浮気中)

リンク

2009/1/11(Sun) 09:31:49|NO.22675

うん?
「ビルドする対象が存在しないってどういうことですか?」と聞かれているのに今気付いた。
文字通りだと思うが。プロジェクトが空か、何らかの異常で「空」と見られてるだけだ。

つーか、何でエラー名で検索しないのか?と、前に言った筈なんだが。



panda

リンク

2009/1/11(Sun) 19:40:03|NO.22694

詰まってたところ、ウルトラ参考になりました。

ゴミレスすみません。



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