質問 |
||
| 質問者:nyororo-n | 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 ソースを貼り付けようと思いましたが、 サイズオーバーではりつけれませんでした。 必要そうであれば補足などに載せます。 以上、よろしくお願いします。 |
|
質問投稿日時:08/03/21 23:08 質問番号:3883454 |
||
回答良回答20pt |
|
| 回答者:x415f484f | 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 |
|---|---|
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| |
回答日時:08/03/23 06:56 回答番号:No.3 |
|
| この回答へのお礼 | ありがとうございます、DLLがちゃんと出来ておりました。 EXEも問題なく動いていましたので、コンパイルの仕方を見直そうと思います。 |
回答良回答10pt |
|
| 回答者:php504 | bcc32 -c dll02.c -cをちゃんとつけてますか 外部シンボル〜のエラーはリンク時にしか出ないのので -c のコンパイルのみでリンクしないオプションをつけたら出ないはずですが。 |
|---|---|
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| |
回答日時:08/03/22 07:56 回答番号:No.2 |
|
| この回答への補足 | ご回答のとおり、エラーが出ておりませんでした。 付け忘れてたみたいですね。 そちらはそれで解決したのですが、次は bcc32 -WD -e dll02.dll dll02.objにて エラー E2194: ファイル 'dll02.dll' が見つからない と表示されてしまいます。 |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| 回答者:x415f484f | > 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); # 変数が定義されていても使われていないという警告は気にしないとして。 > ソースを貼り付けようと思いましたが サンプルが判明している場合はエラーのメッセージだけでソースはなくてもよろしいかと思いますが、 ご自分で修正を加えた場合は修正箇所のみ提示して頂けるとよろしいかと思います。 |
|---|---|
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| |
回答日時:08/03/22 01:53 回答番号:No.1 |
|
| この回答への補足 | 「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」と表示されてしまいます。 |