GetDlgItemでコントロールハンドルの取得がNULL

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
解枝三郎

GetDlgItemでコントロールハンドルの取得がNULL

#1

投稿記事 by 解枝三郎 » 7年前

お世話になります、GetDlgItemでコントロールハンドルの取得がNULLになります
その原因がつかめません、アドバイスお願いできないでしょうか?
症状:
Win32SDKでVC++で作成しております
症状ですが、プロパティBOXの一つのダイヤログの一つのコントロールのみ
ハンドルの取得が出来ておりません、NULLで返します
当方、この原因がわかりません、そのソースは簡単なもので
hIp=GetDlgItem(hDlg,IDC_IPADDRESS1);
というものです、このダイヤログ内で
GetDlgItem(hDlg,IDC_COMBO5)などは全て成功しています
いけないのはIDC_IPADDRESS1のコントロールのみです
よろしくお願いします。

解枝三郎-2

Re: GetDlgItemでコントロールハンドルの取得がNULL

#2

投稿記事 by 解枝三郎-2 » 7年前

その後。。。
スパイでコントロールのIDを拾ったら0x3EAでした、
どういうことなんでしょうか?
勝手にIDが替えられています、0x3EAで
GetDlgItem(hDlg,0x3EA/*IDC_IPADDRESS1*/);
すると正常に取得できます、リソース番号がおかしくなってるようです
ちなみに、関係するファイル削除したり、クリーンアップしても
IDC_IPADDRESS1は受け付けず、一意に0x3EAになります
一体どういう仕組みになってるんでしょうか?

アバター
へにっくす
記事: 634
登録日時: 11年前
住所: 東京都

Re: GetDlgItemでコントロールハンドルの取得がNULL

#3

投稿記事 by へにっくす » 7年前

0x3EAは10進数だと1002です。
IDC_IPADDRESS1で取れないということは、その値(=1002)になっていないのでしょう。
#define IDC_IPADDRESS1のあとの数字を確認してください(resource.hとかに宣言されていませんか)。
かつ、そのリソース(.rcのファイルの該当するダイアログの内容)の該当するコントロールのIDが本当にIDC_IPADDRESS1か確認してください。
またはそのコントロールを作成している個所(CreateWindowかな?)を確認してください。
普通は勝手に書き換わることはないはずですので。


※注意:コードがないのであてずっぽうです。
 的外れなのでしたら、コードを掲示してください。

第214章 IPアドレスコントロール
written by へにっくす

解枝三郎-3

Re: GetDlgItemでコントロールハンドルの取得がNULL

#4

投稿記事 by 解枝三郎-3 » 7年前

へにっくす さん
#define IDC_IPADDRESS1のあとの数字
ですが
#define IDC_IPADDRESS1 5641
#define IDC_IPADDRESS2 5642
#define IDC_IPADDRESS3 5643
にしております
「 IDC_IPADDRESS1が他に定義されているんじゃないですか?」ですが他には無いようです
そこで今、モジュールの前で
#define IDC_IPADDRESS1_ 0x3EA //これはこれでないと不可能?
とこんなことして対策してるんです、
へんてこなことになってますが、なぜなんでしょうか?

アバター
へにっくす
記事: 634
登録日時: 11年前
住所: 東京都

Re: GetDlgItemでコントロールハンドルの取得がNULL

#5

投稿記事 by へにっくす » 7年前

解枝三郎-3 さんが書きました:「 IDC_IPADDRESS1が他に定義されているんじゃないですか?」ですが他には無いようです
他に定義されているか?とは聞いていません。以下のように「確認してください」と言ったのですよ。
へにっくす さんが書きました:かつ、そのリソース(.rcのファイルの該当するダイアログの内容)の該当するコントロールのIDが本当にIDC_IPADDRESS1か確認してください。
リソースファイル(拡張子が.rcのファイル)を掲示してください。本当にその該当するコントロールのIDが、IDC_IPADDRESS1になっていますか。
それを掲示せず、なぜかと問われても答えられません。
オフトピック
一番いいのは、プロジェクト一式をzipにでも固めて、アップロードすることです。
そうすればだれか暇な(^^;)識者が(いたら)確認してくれますよ。
written by へにっくす

解枝三郎-4

Re: GetDlgItemでコントロールハンドルの取得がNULL

#6

投稿記事 by 解枝三郎-4 » 7年前

どうもどうも、へにっくす さん
きたないソースですが、貼り付けてみました
IDD_DIALOG52 DIALOGEX 0, 0, 258, 260
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "1234"
FONT 10, "MS 明朝", 400, 0, 0x80
BEGIN
COMBOBOX IDC_COMBO1,90,10,144,128,CBS_DROPDOWNLIST | CBS_NOINTEGRALHEIGHT | WS_TABSTOP
LTEXT "1234",IDC_STATIC,12,12,72,8
GROUPBOX "",IDC_STATIC,6,0,240,30
COMBOBOX IDC_COMBO3,90,60,72,400,CBS_DROPDOWNLIST | CBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
COMBOBOX IDC_COMBO4,90,78,72,400,CBS_DROPDOWNLIST | CBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
COMBOBOX IDC_COMBO5,90,96,72,400,CBS_DROPDOWNLIST | CBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
COMBOBOX IDC_COMBO6,90,114,72,400,CBS_DROPDOWNLIST | CBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
LTEXT "ボーレート",IDC_STATIC,12,60,72,8
LTEXT "パリティ",IDC_STATIC,12,78,72,8
LTEXT "ストップビット",IDC_STATIC,12,114,72,8
LTEXT "文字ビット幅",IDC_STATIC,12,96,72,8
COMBOBOX IDC_COMBO2,90,42,72,400,CBS_DROPDOWNLIST | CBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
LTEXT "COM 番号",IDC_STATIC,12,42,72,8
GROUPBOX "",IDC_STATIC,6,30,240,144
EDITTEXT IDC_EDIT1,90,132,72,12,ES_AUTOHSCROLL
EDITTEXT IDC_EDIT2,90,150,72,12,ES_AUTOHSCROLL
LTEXT "コマンド",IDC_STATIC,12,132,72,8
LTEXT "レスポンス",IDC_STATIC,12,150,72,8
LTEXT "IPアドレス",IDC_STATIC,12,192,72,8
EDITTEXT IDC_EDIT3,90,210,72,12,ES_AUTOHSCROLL
EDITTEXT IDC_EDIT4,90,228,72,12,ES_AUTOHSCROLL
LTEXT "転送元ポート番号",IDC_STATIC,12,210,72,8
LTEXT "転送先ポート番号",IDC_STATIC,12,228,72,8
GROUPBOX "",IDC_STATIC,6,180,240,66
CONTROL "IPAddress1",IDC_IPADDRESS1,"SysIPAddress32",WS_TABSTOP,90,192,96,12
END
丸ごとzipというのがdllなのでしかも50Mほどあるので無理かと思います
よろしくお願いします

アバター
へにっくす
記事: 634
登録日時: 11年前
住所: 東京都

Re: GetDlgItemでコントロールハンドルの取得がNULL

#7

投稿記事 by へにっくす » 7年前

解枝三郎-4 さんが書きました:丸ごとzipというのがdllなのでしかも50Mほどあるので無理かと思います
全部固めろとは言ってませんよ。ソースだけ(拡張子が.cpp(.c)、.h、.ico、.rc、.vcxprojのファイル)にすれば1MBもいかないはずです。

No.6に掲示してくれたダイアログを取り込んで試してみました。
Visual Studio 2015 Community Editionで作成したプロジェクト一式です。
拡張子が.slnのファイルをダブルクリックすれば読み込むはずです。
Win32Project1.zip
プロジェクト一式(VS2015 Community用)
(20.5 KiB) ダウンロード数: 140 回
ちゃんとコントロールのハンドルを取れましたけどねえ??
証拠画像
dixq_net_f3_t18366_1.png
デバッガで停止して、ハンドルがNULL(=0)になっていないのを確認
ダイアログ表示
dixq_net_f3_t18366_2.png
IPアドレスが設定されます。
dixq_net_f3_t18366_2.png (5.88 KiB) 閲覧数: 5712 回
このプロジェクトのようにあなたのソースは、
DialogBox関数の第2引数に指定しているダイアログのIDがIDD_DIALOG52になっていますか。
DialogBox関数の第4引数に指定している関数の中でGetDlgItemを呼んでいますか。
今一度確認願います。

これ以上の回答はあなたのプロジェクト一式を見ないと分かりません。
written by へにっくす

なんとも説明が(-v-;;)

Re: GetDlgItemでコントロールハンドルの取得がNULL

#8

投稿記事 by なんとも説明が(-v-;;) » 7年前

へにっくすさん
毎度のサポートをありがとうございます。
なんとも説明ができなくて、たぶんですがソース抜き取りでもうまくいくんじゃないかとおもいますよ、
Vc2008ですからリソース関連の不都合が多いです、新しいバージョンではリソースに統合環境からしか
変更できないようにしてあると思うのですが、やはり統合環境使用せずにやるのがプロの道なんでしょうか
C#どころかC++までやってないところで、問題が発生してるんでしょうけど、.netあたりになると
こんな問題は皆無なんでしょうね、今回スパイで取得したリソース番号でアクセスすると問題なく使用できると
解っていますので、その方法で一応解決!とさせていただきます、
もし、それはプロジェクトのこのファイル影響、またリソース定義のこの箇所の問題とかいうことで、
アドバイスがありましたら、よろしくお願いいたします。

閉鎖

“C言語何でも質問掲示板” へ戻る