音楽が最高な映画をART-SCHOOLの木下理樹が紹介!!

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

ソースを貼り付けようと思いましたが、
サイズオーバーではりつけれませんでした。
必要そうであれば補足などに載せます。

以上、よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (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
    • good
    • 0
この回答へのお礼

ありがとうございます、DLLがちゃんと出来ておりました。
EXEも問題なく動いていましたので、コンパイルの仕方を見直そうと思います。

お礼日時:2008/03/23 10:30

bcc32 -c dll02.c


-cをちゃんとつけてますか
外部シンボル~のエラーはリンク時にしか出ないのので -c のコンパイルのみでリンクしないオプションをつけたら出ないはずですが。

この回答への補足

ご回答のとおり、エラーが出ておりませんでした。
付け忘れてたみたいですね。

そちらはそれで解決したのですが、次は
bcc32 -WD -e dll02.dll dll02.objにて
エラー E2194: ファイル 'dll02.dll' が見つからない
と表示されてしまいます。

補足日時:2008/03/22 08:34
    • good
    • 0

> 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)

に変えただけなんですが・・・。
これっていらなかったでしょうか?

補足日時:2008/03/22 08:30
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
回答のとおりに実施増したが、
手順の「implib dll02.lib dll02.dll」にて、
「Error : unable to open file」と表示されてしまいます。

お礼日時:2008/03/23 00:31

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QをVisualStudioでつかえるようにする

<unistd.h>をVisualStudioでつかえるようにしたいのですが、問題なくコンパイルできるようにするにはどうしたらいいでしょうか?

CygwinというやつをインストールしてやってみたのですがやはりVisualStudioだけでコンパイルしてやりたいのですが。。。。

Aベストアンサー

おそらく<unistd.h>をフルスペックで利用したいわけではないと思います。その中の一部の関数を使いたいだけなら<io.h>などで代用できるはずですから、ヘルプで調べてみることをお勧めします。

ソースを修正せずに、コンパイル&実行ができるようにすることは諦めた方がよいと思います。

移植のことを考えるなら、<unistd.h>とか<windows.h>のような環境に特化したヘッダや、そこで宣言される型や関数などを直接使うのではなく、適切にラッピングしてから使う方が後々楽です。今回は仕方ないでしょうが、今後はそうしましょう。


人気Q&Aランキング