修改按值传递的参数对调用者的变量没有影响

时间:2012-12-28 14:38:52

标签: c++ winapi assembly

当我调整窗口大小时,我正在尝试创建一个用其父窗口缩放窗口控件的函数,为了实现这一点,我将CreateWindowEx()嵌入到我自己的函数中createscalingwindow < / p>

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;
              }

在winmain中更改此代码后

    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);

主窗口根本不再显示。嵌入式GetLastError()后调用CreateWindowEx()会返回error_success。

在ollydbg中检查了程序的两个变体之后,我注意到一些奇怪的事情,使用原型执行程序并不像我期望的那样工作。程序调用{​​{1}},然后从调用返回到完全不同的目的地。

以下是我期望程序执行的方式(这是不使用CreateWindowEx的程序): (我不允许以新用户的身份发布图片,所以如果一个mod或某人可以为我修复这些内容会很好。) http://s8.postimage.org/qo8tqt5h1/mainnormal.png

以下是它的执行方式: http://s8.postimage.org/fa8ytr7qt/mainweird.png

您提出的任何帮助我的努力都表示赞赏,所以提前感谢。

1 个答案:

答案 0 :(得分:1)

默认情况下,函数参数按值传递,这意味着函数获取自己的变量副本,而不是对调用者变量的引用。对本地副本所做的任何修改都不会影响传递给函数的任何内容。

如果您想要参考,请按参考传递:

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

现在,您对函数参数所做的任何修改也将修改调用者的变量。