• ベストアンサー

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 ソースを貼り付けようと思いましたが、 サイズオーバーではりつけれませんでした。 必要そうであれば補足などに載せます。 以上、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • x415f484f
  • ベストアンサー率71% (57/80)
回答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

nyororo-n
質問者

お礼

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

その他の回答 (2)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

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

nyororo-n
質問者

補足

ご回答のとおり、エラーが出ておりませんでした。 付け忘れてたみたいですね。 そちらはそれで解決したのですが、次は bcc32 -WD -e dll02.dll dll02.objにて エラー E2194: ファイル 'dll02.dll' が見つからない と表示されてしまいます。

  • x415f484f
  • ベストアンサー率71% (57/80)
回答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); # 変数が定義されていても使われていないという警告は気にしないとして。 > ソースを貼り付けようと思いましたが サンプルが判明している場合はエラーのメッセージだけでソースはなくてもよろしいかと思いますが、 ご自分で修正を加えた場合は修正箇所のみ提示して頂けるとよろしいかと思います。

nyororo-n
質問者

お礼

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

nyororo-n
質問者

補足

「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) に変えただけなんですが・・・。 これっていらなかったでしょうか?

関連するQ&A

  • dllの作り方

    環境 WIN98 VC++6.0 MFC にて 猫でも~において 161章でdllを作りましたが、xxx.dllファイルは作成されますが、xxx.libが作成されません。 162章では両方作られ問題ありません。 作り方は、 メニューから「ファイル」「新規作成」「プロジェクト」(タブ)を選択します。そこから「Win32 Dynamic-Link Library」を選びました。 どうすればxxx.libが作られるのか教えてください。 161章 http://www.kumei.ne.jp/c_lang/sdk2/sdk_161.htm 162章 http://www.kumei.ne.jp/c_lang/sdk2/sdk_162.htm

  • C言語 エラー bcc developer プログラミング

    僕はbcc developerを使ってCプログラミングをしてるんですがしてるんですが今日いきなり【Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照】というようなエラーが出てきました。 困ってます。だれか教えてください↓

  • BCC5.5にてプログラムをUNICODE対応にしたいのですが。。。

    いつもお世話になっています。 小生、只今Win32APIとC言語、開発環境はBCC5.5でアプリを作成しています。 BCC5.5でUNICODEに対応したソースを書きたいのですが、 下記のWebページを参考に(1)のソースを記述してみました。 http://yuzublo.blog48.fc2.com/blog-entry-32.html (1)のソース #define UNICODE #include <windows.h> extern "C" int WINAPI wWinMain( HINSTANCE, HINSTANCE, LPWSTR, int) { return 0; } (1)をbcc32 -WU でコンパイルすると下記のようなメッセージが出ました。 Error: 外部シンボル '_wmain' が未解決(C:\PROGRAM FILES\BCC55\LIB\C0X32W.OBJ が 参照) そして、エントリーポイントを_wmainにしなければいけないのかと思い、 下記の(2)のソースをbcc32 -WUでコンパイルすると、メッセージは出ませんでした。 (2)のソース #define UNICODE #include <windows.h> extern "C" int WINAPI _wmain( HINSTANCE hCurInst, HINSTANCE hPrevInst, LPWSTR lpsCmdLine, int nCmdShow) { return 0; } 果たして、どちらが正しい記述方法なのでしょうか?? 先輩方、アドバイス方、宜しくお願いします。

  • dllの作成方法について

    現在 http://www.kumei.ne.jp/c_lang/sdk2/sdk_119.htm のサイトを参考に、 dllの作り方について勉強しています。 dll01.cpp, dll01.hまでを書いて、コンパイルしようとしたのですが、 c:\users\kei\documents\visual studio 2005\projects\dll01\dll01.h(5) : error C2059: 構文エラー : '文字列' c:\users\kei\documents\visual studio 2005\projects\dll01\dll01.cpp(11) : error C2059: 構文エラー : '文字列' とでてきてコンパイルできません。 解決方法が全く分からず困っています。 どなたかご教授願います。 <環境>   Windows Vista Home Premium Visual C++ 2005 Express Edition

  • CのDLLをVC++でコンパイルしたいのですが、エラーになってしまいます。

    c言語の初心者なのですが、質問させて下さい。 javaからCのDLLを呼び出したく、 (下記のソースを書いたのですが、VC++でコンパイルすると LIBCD.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です Debug/HelloWorld.exe : fatal error LNK1120: 外部参照 1 が未解決です。 と出てしまいます。 過去ログ等を見て、作成しているプロジェクトが悪いのかなと思い、 MFC appWizark(dll) win32 Application win32 Console Application win32 Dynamic-Link Library 等を作ってみてコンパイルしてみたのですが、駄目でした。 ちなみにDOSプロンプトで cl -IC:\j2sdk1.4.2_10\include\win32 -LD HelloWorl d.c -o HelloWorld.dll と実行するときちんとコンパイルできて、正常に実行も出来ました。 VC++でどうやればコンパイルできるのでしょうか? #include "HelloWorld.h" JNIEXPORT void JNICALL Java_HelloWorld_printMessage (JNIEnv *env, jobject me) { printf("Helo World!!!\n"); return; }

  • DLL内からの外部変数の参照

    BCC(フリーコンパイラ)で、WindowsAPIを使った プログラムを作成しています。その過程で、DLLを 作成しているのですが、 test.c を、 bcc32 -WD test.c とし、test.dllを作成しました。 さらにそれを、 implib test.lib test.dll で、test.libを作成ました。 ところが、おなじtest.cファイルで、ほかのファイル の変数を参照しようとして、extern HWND hWnd と書き加えたところ、bcc32 -WD で、参照先が見つか らないというエラーが起こり、DLLが作成できなく なってしまいました。 DLL内から外部の変数を参照するにはどうしたらよいで しょうか。この場合の外部の変数というのは、WinMain 関数のあるmain.cファイル内の静的変数です。 よろしくお願いいたします。

  • 異なる言語同士(VBとCなど)のプログラムを呼ぶ方法、dllの作成法

    VBから自作のCプログラムを呼び出したいです。 ダイナミックリンクライブラリ(dll)を使わない解もあるのでしょう。 私は、Cのダイナミックリンクライブラリ(dll)を自作して、Cから呼び出す方法を探りました。 VCの新規作成メニュに、Win 32 Dynamic-Link Libraryがあるので、これを使えばいいのではと思うのですが、ソースでどう宣言したらいいのか、それをCから、またVBから、どのように呼び出すかがわかりません。WinAPIのように宣言して使うのかなと思うのですが。 なお、.NETでない解決法を知りたいです。 ご存知の方よろしくお願いします。

  • DLLのスタティックリンクは可能?

    C言語(C++)で、スタティックライブラリと同じ要領でDLLをEXEに含めることはできるでしょうか? 環境は、BCC5.5とVC2005の両方でお願いします。

  • MDI(自作メモ帳)の子ウィンドウのHWND取得について

    はじめまして、TKOZという者です。 c言語とWINAPIでMDIの自作メモ帳を作っています。 ところで、MDIを使って、複数のドキュメントウィンドウでテキストファイル を保存したいのですが、選択されたドキュメントウィンドウの保存をする 際にそのドキュメントウィンドウのHWND取得をしたいのですが、 どうすればいいでしょうか? ソースコードはこれです。 http://www.kumei.ne.jp/c_lang/sdk/sdk_83.htm http://www.kumei.ne.jp/c_lang/sdk/sdk_84.htm http://www.kumei.ne.jp/c_lang/sdk/sdk_85.htm

  • 猫でもわかるプログラミング161章

    http://www.kumei.ne.jp/c_lang/sdk2/sdk_161.htm にDLLを使ったメッセージフックについて説明があるのですが、どうもその通りにやってもうまくいきません。 まず、 1.dll作成する際にlibが生成されない。 2.ヘッダファイルに #define EXPORT extern "C" __declspec(dllexport) を付け加え、 EXPORT LRESULT CALLBACK .... という風にEXPORTをつけてビルドすると、libファイルが生成されるものの、それをメインプログラムのプロジェクトに追加しても リンク中... hookmain.obj : error LNK2001: 外部シンボル ""int __cdecl ResetHook(void)" (?ResetHook@@YAHXZ)" は未解決です hookmain.obj : error LNK2001: 外部シンボル ""int __cdecl SetHook(void)" (?SetHook@@YAHXZ)" は未解決です Debug/hook.exe : fatal error LNK1120: 外部参照 2 が未解決です。 link.exe の実行エラー というエラーが起きます。 このエラーが何を意味しているかもわからず、dllについても勉強中なのでどこを直せばいいかがみえてきません。どなたかわかる方がいらしたらよろしくお願いします VC++ 6.0 WinXP

専門家に質問してみよう