WINAPIにてDLLが作成できません。
なにがダメなのかわかりません。
教えてもらえないでしょうか?
参考サイト:
http://www.kumei.ne.jp/c_lang/sdk2/sdk_120.htm(VC++ソース)
http://www.ecoop.net/coop/tips/dll.html#DLLonBCC(上記ソースをBCC用に修正するのに参考)
現状(dll02.c=DLLソース):
bcc32 -c dll02.c //ここで「Error: 外部シンボル '_main' が未解決」と返されます。
bcc32 -WD -e dll02.dll dll02.obj
ソースを貼り付けようと思いましたが、
サイズオーバーではりつけれませんでした。
必要そうであれば補足などに載せます。
以上、よろしくお願いします。
No.1
- 回答日時:
> bcc32 -c dll02.c //ここで「Error: 外部シンボル '_main' が未解決」と返されます。
拡張子 .c のファイルは -P を付けないと C++ としてコンパイルされないのでは?
ソースの修正が済んでいるのなら、この三行でサンプルのコンパイルが通るはずです。
bcc32 -tWD -P -c dll02.c
implib dll02.lib dll02.dll
bcc32 -tW -P testdll02.c dll02.lib
ちなみに修正箇所も dll02.cpp のこの行だけ修正すればコンパイルは通ると思いますけど?
> hOldPen = SelectObject(hdc, hPen);
hOldPen = (HPEN__ *)SelectObject(hdc, hPen);
# 変数が定義されていても使われていないという警告は気にしないとして。
> ソースを貼り付けようと思いましたが
サンプルが判明している場合はエラーのメッセージだけでソースはなくてもよろしいかと思いますが、
ご自分で修正を加えた場合は修正箇所のみ提示して頂けるとよろしいかと思います。
この回答への補足
「dllmainとエクスポートする関数の全てに__declspec(dllexport)とWINAPIをつける.」とサイトに記述があったので、
__declspec(dllexport) int WINAPI dllmain(HINSTANCE hInst, DWORD fdwReason, PVOID pvReserved)
__declspec(dllexport) BOOL CALLBACK MyDraw(HDC hdc, int x1, int y1, int x2, int y2, COLORREF crColor)
__declspec(dllexport) BOOL WINAPI InitApp(HINSTANCE hInst, WNDPROC WndProc, LPCTSTR szClassName)
__declspec(dllexport) BOOL WINAPI InitInstance(HINSTANCE hInst, int nCmdShow, LPCTSTR szClassName)
に変えただけなんですが・・・。
これっていらなかったでしょうか?
回答ありがとうございます。
回答のとおりに実施増したが、
手順の「implib dll02.lib dll02.dll」にて、
「Error : unable to open file」と表示されてしまいます。
No.2
- 回答日時:
bcc32 -c dll02.c
-cをちゃんとつけてますか
外部シンボル~のエラーはリンク時にしか出ないのので -c のコンパイルのみでリンクしないオプションをつけたら出ないはずですが。
この回答への補足
ご回答のとおり、エラーが出ておりませんでした。
付け忘れてたみたいですね。
そちらはそれで解決したのですが、次は
bcc32 -WD -e dll02.dll dll02.objにて
エラー E2194: ファイル 'dll02.dll' が見つからない
と表示されてしまいます。
No.3ベストアンサー
- 回答日時:
ANo.1 補足から引用
> __declspec(dllexport)
(省略)
> これっていらなかったでしょうか?
このサンプルでは要りません、理由は次の通りです。
http://www.kumei.ne.jp/c_lang/sdk2/sdk_120.htm
上記 URL から引用
> // dll02.h
> #define EXPORT extern "C" __declspec(dllexport)
>
> EXPORT BOOL CALLBACK MyDraw(HDC, int, int, int, int, OLORREF);
先頭で #define EXPORT ... として定義しているので敢えて書き直す必要はないのです。
ANo.1 お礼から引用
> 手順の「implib dll02.lib dll02.dll」にて、
>「Error : unable to open file」と表示されてしまいます。
それは……
ANo.1 から引用
> bcc32 -tWD -P -c dll02.c
これはコンパイル迄でした、申し訳ありませんでした。
(コピーした時に -c を消し忘れました)
DLL まで一気に生成(リンク)する場合には -c は不要です。
くどいようですが、細かく解説させて頂きます。
bcc32 -tWD -P dll02.c
と打つと dll02.dll が生成されるので、次に
implib dll02.lib dll02.dll
と打つと、インポートライブラリの lib02.lib が生成され、次に
bcc32 -tW -P testdll02.c dll02.lib
と打つと testdll02.c のコンパイルとリンクが完了します。
# というのが、ANo.1 に記述してあることです。
ちなみに BCC32 だけで何の引数の指定なしで打ってみてください。
使用方法が出ると思われます。
-e の説明は「-exxx Excutable File」
-c の説明は「-c Compile Only」
となっているはずです。
ANo.2 の補足から引用
> bcc32 -WD -e dll02.dll dll02.obj
bcc32 -tWD -edll02.dll dll02.obj
のように -e と dll02.dll の間は空白文字は入れません。
以下は蛇足ですが、あなたがなさりたかったのはおそらくこの手順なのではないのでしょうか?
・ dll02.dll の生成
(1) まずはコンパイルしてオブジェクトを生成
bcc32 -tWD -c -P dll02.c
(2) 次にオブジェクトをリンクして DLL を生成
bcc32 -tWD -edll02.dll dll02.obj
(3) DLL からインポートライブラリ生成
implib dll02.lib dll02.dll
サンプルの DLL テスト用実行ファイルのコンパイルも記述しておきます。
# あなたがなさった手順と同じように実行ファイル生成するには次のようになると思われます。
・ dlltest2.exe の生成
(1) まずはコンパイルしてオブジェクトを生成
bcc32 -tW -c -P dlltest2.c
(拡張子が .cpp であれば -P は不要)
(2) 次にオブジェクトとライブラリをリンクして EXE を生成
bcc32 -tW -edlltest2.exe dlltest2.obj dll02.lib
ありがとうございます、DLLがちゃんと出来ておりました。
EXEも問題なく動いていましたので、コンパイルの仕方を見直そうと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
自作DLLってkernel32.dllやuser...
-
APIの呼び出しDLLファイルの場...
-
VC++2010でdllファイルの作成に...
-
ファイルをvbaで圧縮したいので...
-
指定された引数が有効範囲にな...
-
ILMergeのエラーの原因と対策
-
[VBA]64b版-行数表示.dllの登録...
-
res://ieframe.dll/について
-
NlsData000c.dllの入手方法
-
Sound Engine で MP3ファイル...
-
C# DLL エントリ ポイントが...
-
dllをいじる。。
-
steamのゲームが起動しません。
-
VBAエディタのコード画面で、カ...
-
C# ネット上に公開されているFF...
-
python エラー
-
エクセルのエラーメッセージ「4...
-
<unistd.h>をVisualStudioでつ...
-
アプリケーションのDLLファイル...
-
VBAを何回も作り直して、容量が...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
res://ieframe.dll/について
-
ASP.NETのDLL入れ替えについて
-
VB6.0(SP6)にて開発を行なって...
-
WIN10で常にフォームを手前に
-
C# DLL エントリ ポイントが...
-
ファイルをvbaで圧縮したいので...
-
visual studioの不要なDll削除方法
-
手書き文字認識のdll
-
M365にアップデートしてからコ...
-
[VBA]64b版-行数表示.dllの登録...
-
VBAエディタのコード画面で、カ...
-
ベースアドレスの設定について
-
メイクファイルからdllを生成す...
-
VBからIMEパッドを呼び出す方法...
-
パソリからIDをVB6で読み込みた...
-
実行ファイルからソースファイ...
-
steamのゲームが起動しません。
-
APIの呼び出しDLLファイルの場...
-
指定された引数が有効範囲にな...
-
dllをいじる。。
おすすめ情報