アプリ版:「スタンプのみでお礼する」機能のリリースについて

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ファイル内の静的変数です。

よろしくお願いいたします。

A 回答 (3件)

>extern 宣言をすると、参照できないというエラーが出て


逆ですね。DLL側(test.c)は実体定義をします。

  HWND hWnd; // MessageBox表示親ハンドル

WinMain(main.c)でextern宣言します。

  extern HWND hWnd; // (実体はtest.dll)

test.c内では、このハンドルを使用してMessageBox()関数をコールします。
main.cでは、このハンドルに自身のウィンドウハンドルを退避しておきます。
    • good
    • 0
この回答へのお礼

できました!!どうもありがとうございます。
mainからDLL側を参照するんですね。
DLL側から参照することしか考えられなかった
自分に欝です。
今後、DLLを利用する上でも大変参考になりました。
長文に何度も回答していただきどうもありがとう
ございました。

お礼日時:2005/11/16 17:47

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関数です)

長文ですみません。

補足日時:2005/11/15 19:27
    • good
    • 0

そんな危険なことできるのでしょうか。


ダイナミックリンクですよね?
静的ライブラリならともかく・・・
(もしできるのなら、私もしりたいです。今後のために)
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
上に書いてなかったのですが、グローバルフック関数
を使おうとしたところ、DLLにしなければいけない
というような説明があったものでDLLにしたのですが、
ちゃんと呼び出されたか確認するために、WinMain
側のウインドウに表示したいと思ったのです。
そのために、WinMainのウインドウのハンドルを外部
参照したのですが。DLLの性質を考えるとやっぱり
マズいですかね。

お礼日時:2005/11/15 16:33

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