2012-12-28 26 views
0

我試圖做一個函數,當我調整窗口的大小時,用它的父窗口縮放窗口的控件,爲了實現這個我嵌入CreateWindowEx()到我自己的功能createscalingwindow通過值傳遞修改參數對調用者的變量沒有影響

int createscalingwindow (HWND cswpara0,DWORD cswpara1,const CHAR* cswpara2, 
const CHAR* cswpara3,DWORD cswpara4,int cswpara5,int cswpara6,int cswpara7, 
int cswpara8,HWND cswpara9,HMENU cswpara10,HINSTANCE cswpara11,LPVOID cswpara12) 
       { 
       cswpara0 = CreateWindowEx (cswpara1, cswpara2, cswpara3, cswpara4, 
              cswpara5,cswpara6,cswpara7,cswpara8, 
             cswpara9,cswpara10,cswpara11,cswpara12); 
       return 0; 
       } 

中緊跟不斷變化的這段代碼

mainwin = CreateWindowEx(
     0,     
     mainclassname,   
     "Mafia Online",  
     WS_OVERLAPPED|WS_CAPTION|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX 
     |WS_SYSMENU, 
     CW_USEDEFAULT,  
     CW_USEDEFAULT,  
     544,     
     375,     
     NULL,   
     playmenu,     
     hThisInstance,  
     NULL     
     ); 

下面的代碼

createscalingwindow (mainwin, 0, mainclassname, "Mafia Online", 
WS_OVERLAPPED|WS_CAPTION|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_SYSMENU, 
CW_USEDEFAULT, CW_USEDEFAULT, 544, 375, NULL, playmenu, hThisInstance, NULL); 
ShowWindow (mainwin, nCmdShow); 
01後

主窗口根本不再顯示。嵌入CreateWindowEx()後調用GetLastError()返回error_success。

在ollydbg中檢查了這兩種程序的變體之後,我發現了一些奇怪的東西,使用原型的程序執行並不按我期望的方式工作。該程序調用CreateWindowEx,然後從呼叫返回到完全不同的目的地。

下面是我期望程序執行的方式(這是不使用createscalingwindow的程序): (我不允許將圖像作爲新用戶發佈,所以如果某個mod或某人可以修復這些問題,我認爲將是很好) http://s8.postimage.org/qo8tqt5h1/mainnormal.png

下面是它的執行。 http://s8.postimage.org/fa8ytr7qt/mainweird.png

您提出到幫助我的任何的努力表示讚賞,所以先感謝。

+0

您需要通過引用傳遞'cswpara0'。 – 2012-12-28 14:49:26

+0

@aleguna HWND是一個開頭的指針。 – johnathon

+0

@johnathon,'createscalingwindow'並不重要,他正在修改HWND的本地副本,這就是爲什麼它對調用者副本沒有任何影響。 – 2012-12-28 14:51:22

回答

1

默認情況下,函數參數是按值傳遞的,這意味着該函數獲取自己的變量副本,而不是對調用方變量的引用。對本地副本進行的任何修改都不會影響傳遞給該函數的任何內容。

如果你想有一個基準,然後通過引用傳遞:

int createscalingwindow (HWND & cswpara0 /* etc. */) 
          ^

現在您對功能參數進行任何修改也將修改調用者的變量。

相關問題