CP VC6//dlgdata.cpp line 43 之「不要相信tool」的鐵則

  1. CP VC6//dlgdata.cpp line 43 之「不要相信tool」的鐵則

CP VC6//dlgdata.cpp line 43 之「不要相信tool」的鐵則

原文連結: https://darkblack01.blogspot.com/2012/08/dlgdatacpp-line-43tool.html
移植時的最後更新日期: 2012-09-12T17:31:57.387+08:00


這是一個不知道,該怎麼命名的issue,可以叫「IID 分配錯誤 MFC」,不過在此姑且稱「dlgdata.cpp line 43」(Google建議)



不過這樣去查,都沒有什麼具體的解法。
一開始查到這個,它是說對話框裡的控制項失效,所以在搭配ID時出了問題。
解決方案:刪掉失效的控制項。

問題就在,我這個對話框是新做的耶!每一個都是我仔細弄的,沒有一個是多餘或失效的呀?!不過,基於相信Google的立場(畢竟它帶我走過千千萬萬個bug了)就做故看吧!

結果,所有的控制項都刪掉了,程式終於不會出現上面的錯誤訊息,但是!
卻跑出了另一個對話框。

它是另一組ID才對呀?!奇怪了!而且Google失效!代表這一個issue少見又非同小可!= =+


「李組長眉頭一皺,發現案情並不單純」(用相同的心情,繼續往下看)

繼續看Google查到的東西,下面有沒有什麼不一樣的,但是大多都重覆,最多查到這個


問題原因:沒有找到這個相應控制項類型 !
       一般有三種情況:一是控制項ID不存在,二是控制項未創建,三是控制項的類型不對 

似乎,案情到了一個多方向發展的可能性,算是好事,也算是壞事。
好事就是,有希望可以解。
壞事就是,沒有教你怎麼解,只有提示。= =+

就這樣....一直沒有提到,我做了什麼導致這一件事!

前情提要:


我一如往常的,將對話框的製作採取了分專案的方式製作。
等到對話框做得差不多時就可以併入SDI的視窗,再寫內部運作程式或整合程式碼。
而且,在製作對話框時,我使用的是開Dialog專案,再用一個Button呼叫要設計的Dialog。
這樣一來,可以用相同的呼叫模式,幾乎不用改的程式碼,放進主程式架構中。

按往Ctrl把設計好的Dialog UI 複製到主架構中。


把程式碼合併到主架構的專案檔裡(修改#include之類的)

一直到這,就是一如往常的步驟,但是就這樣出錯了!怎麼會?我前面還做了兩個Dialog,現在這一個是故意拖我的時間而出錯的嗎?(自以為)


仔細檢查一下,ID是怎麼運作的!它其實是一組內部對應的字串,骨子裡是數字。
利用#define的方式代換成數字,利用enmu的方式放進類別中。
類別看見了數字運作。

所以找找這一個define放在哪,放在resource.h裡
每一個專案都會有這東西。

嗯....可是,剛剛刪控制項時,就找過啦!怎麼會有問題?


就在這時我就想說,是不是舊的(子專案)的resource.h有呼叫(或沒有呼叫到?)
檢查了一下呼叫方式,並且調整一下(花了很多時間,沒用)

就在這時,我把兩邊的檔案都打開,想說手動貼過去。



在這個時候,不小心發現,兩邊的ID,define了相同的數字
而這兩個ID,剛好就是我呼叫錯了的兩個Dialog UI。

試試看將它們改成不同的(改子專案裡的數字)
就成功了!

真是爛BUG!><

另解:

在resource.h裡面

include上各子專案的resource.h


#include "MsrItems/resource.h"
#include "OmdFile/resource.h"
#include "SelXls/resource.h"
#include "xMsrPoint/resource.h"


另解失敗,因為軟體會重新運算這個檔案,所以只能自求運氣要好!XD
(重新運算造成的問題,真是>"<)

另解的另解:

編輯各子專案的resource.h檔,讓彼此的號碼一致。

MSDN解:
這個bug,原來叫「Resource Compiler Error RC2104」
還可以在MSDN找到了一篇ERROR解決方案

若這個error是出現

   undefined keyword or key name: MFT_STRING

則在 "VC6安裝目錄\MFC\Include\AfxRes.h" 增加一個#include,如下:

   #include <winresrc.h>

但是,又生出了另一個warning,而且還在MFC的檔案裡!(算是微軟的??)




過了幾次的bug,以上的做法又失敗,再嚐試別的做法,終於在經過反覆的嚐試之後,有了最後一招!
在有問題的檔案(通常是某對話框的.h檔)加上下面的code

   #include "research.h"

沒錯!就是將主程式的research加上來,讓它不會和自己子專案裡的research.h搞混,宣告到不對的ID(但是這樣就不能獨立執行子專案了,不過沒關係,子專案是原型。)