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ファイル内の静的変数です。
よろしくお願いいたします。
No.3ベストアンサー
- 回答日時:
>extern 宣言をすると、参照できないというエラーが出て
逆ですね。DLL側(test.c)は実体定義をします。
HWND hWnd; // MessageBox表示親ハンドル
WinMain(main.c)でextern宣言します。
extern HWND hWnd; // (実体はtest.dll)
test.c内では、このハンドルを使用してMessageBox()関数をコールします。
main.cでは、このハンドルに自身のウィンドウハンドルを退避しておきます。
できました!!どうもありがとうございます。
mainからDLL側を参照するんですね。
DLL側から参照することしか考えられなかった
自分に欝です。
今後、DLLを利用する上でも大変参考になりました。
長文に何度も回答していただきどうもありがとう
ございました。
No.2
- 回答日時:
ANo.1です。
単純に呼び出し元の、ウィンドウハンドルが参照したいのであれば、
DLL側に(test.c)に実態(HWND hWnd)を外部変数宣言して
使用すればできますよね?
(そのためにコードを書くことになってしまいますが・・・)
この回答への補足
ありがとうございます。
外部変数宣言というのは extern HWND hWnd のことでしょうか?
もしそうならそれはすでにやってみたのですが、
bcc32 -WD test.c で、
普通なら test.dll ができるのですが、extern 宣言を
すると、参照できないというエラーが出て、dll の代
わりに test.obj が作成されます。
一応、その test.obj と main.obj を
bcc32 -W main.obj test.obj
でリンクするとexe ファイルが作成されるのですが、
DLLMainなどのエントリポイントの関数が呼び出され
ず、結果としてフックに失敗します。
また、extern 宣言をしない状態で、dll を作成し、
リンクすると、DLLMain が呼び出され、フックにも
成功します。(呼び出しの確認はMessageBox関数です)
長文ですみません。
No.1
- 回答日時:
そんな危険なことできるのでしょうか。
ダイナミックリンクですよね?
静的ライブラリならともかく・・・
(もしできるのなら、私もしりたいです。今後のために)
ご回答ありがとうございます。
上に書いてなかったのですが、グローバルフック関数
を使おうとしたところ、DLLにしなければいけない
というような説明があったものでDLLにしたのですが、
ちゃんと呼び出されたか確認するために、WinMain
側のウインドウに表示したいと思ったのです。
そのために、WinMainのウインドウのハンドルを外部
参照したのですが。DLLの性質を考えるとやっぱり
マズいですかね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) IT初心者です 仕事で、vb.netで作成されたdllをvbaで呼び出すプログラムを作成しろと言われ 1 2023/03/27 08:22
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- その他(プログラミング・Web制作) VScodeでpythonプログラムの関数を実行したい 2 2022/07/13 19:24
- フリーソフト cygewf-2.dllがない、と表示され、ダウンロードしたファイルが動作しない 2 2023/03/27 11:05
- Excel(エクセル) excel関数について 3 2022/06/06 21:58
- Excel(エクセル) フォルダ内のエクセルファイルを開かずにデータ採取する関数式 2 2022/12/22 22:15
- JavaScript [再掲]指定したパスが現URLに含まれていたら特定要素を削除するJavascriptのコードについて 1 2023/05/10 15:09
- サーバー Windowsサーバでグループを検索したい 1 2023/04/17 15:30
- Visual Basic(VBA) VBA GetAttrについて教えてください 2 2022/12/22 15:25
- Windows 10 renameコマンドでファイル名からアンダースコアを消す方法 5 2023/04/24 13:33
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel VABについて 下記記述が...
-
End Sub が必要です。
-
他クラスからForm1内コントロル...
-
select関数の使用方法について
-
Texに詳しい方よろしくお願いい...
-
C# IEnumerable が IEnumerable...
-
intel fortranのエラーで困って...
-
フォートランのエラーについて...
-
ラズパイ上の、pythonのエラー...
-
DLL内からの外部変数の参照
-
エクセルで特定の列が0表示の場...
-
Excel・Word リサーチ機能を無...
-
配列数式の解除
-
教えて下さい
-
UserForm1.Showでエラーになり...
-
Excel マクロでShearePoint先の...
-
特定のPCだけ動作しないVBAマク...
-
Excel VBAからAccessマクロを実...
-
String""から型'Double'への変...
-
エクセルに張り付けた写真のフ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
End Sub が必要です。
-
フォートランのエラーについて...
-
intel fortranのエラーで困って...
-
他クラスからForm1内コントロル...
-
typedef による2重定義
-
C# IEnumerable が IEnumerable...
-
フォートラン(fortran)のエラー...
-
43:syntax error at end of input
-
ラズパイ上の、pythonのエラー...
-
Excel VABについて 下記記述が...
-
VBでエラー'ActiveX component ...
-
Makefile と <math.h>
-
AccessVBAでVLookupを使いたい
-
Delphiでif文がうまく書けないです
-
フォートランでの記述に関して
-
Excel VBA: UserForm.Show で実...
-
対応する関数ヘッダーがありません
-
C言語のプログラムが実行できま...
-
#ifndefとかヘッダファイルにつ...
-
Texに詳しい方よろしくお願いい...
おすすめ情報