- ベストアンサー
DLL作成手順について(BCC)
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 ソースを貼り付けようと思いましたが、 サイズオーバーではりつけれませんでした。 必要そうであれば補足などに載せます。 以上、よろしくお願いします。
- みんなの回答 (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
その他の回答 (2)
- php504
- ベストアンサー率42% (926/2160)
bcc32 -c dll02.c -cをちゃんとつけてますか 外部シンボル~のエラーはリンク時にしか出ないのので -c のコンパイルのみでリンクしないオプションをつけたら出ないはずですが。
補足
ご回答のとおり、エラーが出ておりませんでした。 付け忘れてたみたいですね。 そちらはそれで解決したのですが、次は bcc32 -WD -e dll02.dll dll02.objにて エラー E2194: ファイル 'dll02.dll' が見つからない と表示されてしまいます。
- x415f484f
- ベストアンサー率71% (57/80)
> 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); # 変数が定義されていても使われていないという警告は気にしないとして。 > ソースを貼り付けようと思いましたが サンプルが判明している場合はエラーのメッセージだけでソースはなくてもよろしいかと思いますが、 ご自分で修正を加えた場合は修正箇所のみ提示して頂けるとよろしいかと思います。
お礼
回答ありがとうございます。 回答のとおりに実施増したが、 手順の「implib dll02.lib dll02.dll」にて、 「Error : unable to open file」と表示されてしまいます。
補足
「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) に変えただけなんですが・・・。 これっていらなかったでしょうか?
お礼
ありがとうございます、DLLがちゃんと出来ておりました。 EXEも問題なく動いていましたので、コンパイルの仕方を見直そうと思います。