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.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も問題なく動いていましたので、コンパイルの仕方を見直そうと思います。
No.2
- 回答日時:
bcc32 -c dll02.c
-cをちゃんとつけてますか
外部シンボル~のエラーはリンク時にしか出ないのので -c のコンパイルのみでリンクしないオプションをつけたら出ないはずですが。
この回答への補足
ご回答のとおり、エラーが出ておりませんでした。
付け忘れてたみたいですね。
そちらはそれで解決したのですが、次は
bcc32 -WD -e dll02.dll dll02.objにて
エラー E2194: ファイル 'dll02.dll' が見つからない
と表示されてしまいます。
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」と表示されてしまいます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) IT初心者です 仕事で、vb.netで作成されたdllをvbaで呼び出すプログラムを作成しろと言われ 1 2023/03/27 08:22
- Windows 10 IT初心者です! powershellで以下のようなエラーが出ました オブジェクト参照がオブジェクト 1 2023/05/17 11:30
- フリーソフト cygewf-2.dllがない、と表示され、ダウンロードしたファイルが動作しない 2 2023/03/27 11:05
- ノートパソコン .dllファイルがありませんと表示される 5 2023/04/30 03:03
- その他(OS) OBSが起動できません 3 2022/03/30 12:21
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- その他(コンピューター・テクノロジー) パソ粥が壊れてしまい。 新しく買ったパソコンに Amplitued5 Max をダウンロードインスト 1 2022/05/22 00:33
- その他(ソフトウェア) MMD PMXエディタ プラグイン 押せない はじめまして。MMDについて質問させていただきます。 7 2022/05/04 15:53
- JavaScript jsで診断コンテンツのページ内切り替えについて 1 2023/04/14 17:31
- HTML・CSS (Javascript)印刷するファイルに応じて印刷プレビュー画面で用紙を自動的に切り替えたい!! 2 2022/04/11 12:04
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# Windowsエクスプローラの『...
-
about:blankの削除したいのです...
-
python エラー
-
<unistd.h>をVisualStudioでつ...
-
エクセルのエラーメッセージ「4...
-
アプリケーションのDLLファイル...
-
実行後にコンパイルに失敗しま...
-
VBAを何回も作り直して、容量が...
-
クリティカルエラー Expressio...
-
Excelのエラーで困ってます。
-
Cのコンパイルでコメントアウト...
-
パーサとコンパイラの違いって?
-
C言語でのコンパイラの作成方法
-
相互に参照する構造体について
-
Fortranについて教えてください
-
GDL(GCC DEVELOPER LITE)の...
-
PRO*C コンパイルエラー
-
C++のvectorについて教えてくだ...
-
Fortran の定数表現について
-
multiple definitionというエラー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
visual studioの不要なDll削除方法
-
ファイルをvbaで圧縮したいので...
-
VB6.0(SP6)にて開発を行なって...
-
res://ieframe.dll/について
-
C# DLL エントリ ポイントが...
-
ASP.NETのDLL入れ替えについて
-
WIN10で常にフォームを手前に
-
VBAエディタのコード画面で、カ...
-
VB.NET xdoc2txtをつかってPDF...
-
VC++6.0 でのライブラリ参照方法
-
MFC7.0ランタイムライブラリ
-
指定された引数が有効範囲にな...
-
user32.dllがないためアプリが...
-
自作のDLLがみつからない
-
VBからIMEパッドを呼び出す方法...
-
dllをいじる。。
-
vb6で作成した画面が処理に時間...
-
M365にアップデートしてからコ...
-
[VBA]64b版-行数表示.dllの登録...
-
*.exeと異なるフォルダのDLLを...
おすすめ情報