2008-10-02 19 views
0

我目前正在將大量代碼從基於MFC的應用程序移植到DLL以實現客戶機品牌目的。引用的結構不會「粘住」

我遇到了一個不尋常的問題。的碼,該位是在兩個系統中是相同的:

// ... 
    CCommsProperties props; 

    pController->GetProperties(props); 
    if (props.handshake != HANDSHAKE_RTS_CTS) 
    { 
     props.handshake = HANDSHAKE_RTS_CTS; 
     pController->RefreshCommProperties(props); 
    } 

// ... in another file: 
void CControllerSI::RefreshCommProperties (const CCommsProperties& props) 
{ 
    // ... code ... 
} 

CommProperties是用於通訊的設置的包裝器等的串行化和P控制器的類型是ControllerSI這本身就是實際的通訊和應用程序之間的層組成。

在原始的MFC版本上,設置與RTS-CTS支持的握手,但在作爲DLL版本運行時,只要輸入該函數,它就會自動重置爲0。代碼完全包含在代碼的DLL部分中,所以沒有邊界。

原有和新的模塊之間的主要區別是,調用各種對話框已被刪除的變量和已刪除#包括

我已經失去了一個下午的這一點,我真的不希望失去更多...

+0

爲什麼這個問題關閉爲「脫離主題」? – augustin 2010-12-09 03:50:09

+0

我最初關閉了,但我不記得關閉它作爲題外話。也許是在他們對結束代碼進行細化之前,所有以前關閉的問題都被設置爲「off-topic」的默認值。 – 2010-12-09 13:17:10

回答

0

在Saratv發佈之後,我決定拋棄我所做的並重新從工作源重新啓動它。

但是這次它工作...我想我永遠不會知道爲什麼通過結構導致它改變。

1

單從給定的代碼很難看出什麼是錯的。一些一般的指針:

  1. 如果類/結構被共享它不是導出的對象被初始化並在使用不兼容的連接不同的二進制模塊處理(如C-運行時間)

  2. /進口正確。

  3. 該類定義在多個地方,並且沒有包含正確的定義。

上述三個是最可能的原因,尤其是,如果所有字段都重置爲默認的初始化值。

如果這隻發生在只有一個或兩個字段的情況下,則結構可能對齊不良,您可能需要重新排列字段以更正這些字段(也請在發佈中檢查)。

一般來說,我很想假設你已初始化的對象不是由於某種原因看到的,可能是以上三種之一。

0

要真正弄清楚發生了什麼,你可能需要發佈你的源代碼 - 或者至少要複製這個問題。不幸的是,StackOverflow似乎並不鼓勵這樣做。您可以將您的代碼發佈到FTP站點或轉到允許發佈源代碼的站點(如CodeGuru)。

0

CCommsProperties可能在兩個不同的地方被定義,每個文件都包含它自己的版本。

爲了測試這個理論,在調試器中,你需要看看& props.handshake。如果調試器告訴你該字段在函數內外有不同的地址,那麼這個假設是真實的,你可以繼續檢查預處理器的輸出來找出它發生的原因。