如何在Masm32汇编语言中构造GetWindowText的争论?

时间:2015-07-06 02:38:06

标签: assembly textbox arguments masm32 construct

请相信我不熟悉汇编语言。

我这里有一个代码,可以添加两个textbox的值,并在按下按钮时在第三个上显示结果。

我尝试使用GetWindowText命令构造参数但它有时没有显示任何崩溃的内容,我使用我正在使用的相同程序查看网页,但我只找到了这个{{ 3}}不同之处在于我使用GetDlgItemText,因为我在From stackoverflow上读取它在对话框中检索与控件关联的标题或文本,但我没有使用对话框所以也许我只会坚持GetWindowText功能。

这是我制作的代码,但老实说,我不知道这里发生了什么我只是因为我不知道如何为GetWindowText函数构造一个参数。

你看到的一些代码是我日前工作的程序中的循环代码,这是一个简单的添加操作,当我在控制台中输入两个值时,它会添加数字并显示结果。现在,我试图再次尝试,但使用文本框和按钮,但我无法正确使用。

减速:

.data?

    EditIn1ID db 10 dup(?)
    EditIn2ID db 10 dup(?)
    EditOutID db 10 dup(?)


    hButton HWND ?
    hEditIn1 HWND ?
    hEditIn2 HWND ?
    hEditOut HWND ?

文本框和按钮功能

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    .if uMsg == WM_DESTROY
        invoke PostQuitMessage, 0

    .elseif uMsg == WM_CREATE


        invoke CreateWindowEx, NULL, addr ButtonClassName, addr ButtonAdd, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 225, 10, 120, 30, hWnd, ButtonID, hInstance, NULL
        mov hButton, eax

        invoke CreateWindowEx, WS_EX_CLIENTEDGE, addr EditClassName, NULL, WS_CHILD or WS_VISIBLE, 10, 10, 120, 30, hWnd, EditIn1ID, hInstance, NULL
        mov DWORD PTR [hEditIn1], eax
        invoke CreateWindowEx, WS_EX_CLIENTEDGE, addr EditClassName, NULL, WS_CHILD or WS_VISIBLE, 10, 50, 120, 30, hWnd, EditIn2ID, hInstance, NULL
        mov DWORD PTR [hEditIn2], eax
        invoke CreateWindowEx, WS_EX_CLIENTEDGE, addr EditClassName, NULL, WS_CHILD or WS_VISIBLE, 10, 110, 120, 30, hWnd, EditOutID, hInstance, NULL
        mov DWORD PTR [hEditOut], eax


    .elseif uMsg == WM_COMMAND   
        mov eax, wParam
            .if eax == ButtonID
                 shr eax, 16
                .if ax == BN_CLICKED

               invoke GetWindowText,EditIn1ID, eax, 10
               invoke atodw, addr EditIn1ID
               mov ebx, eax 

               invoke GetWindowText,EditIn2ID, ebx, 10
               invoke atodw, addr EditIn2ID
               add ebx, eax

               invoke dwtoa, ebx, addr res
               invoke SetWindowText,EditOutID, addr res


                    .endif
            .endif

以下是我对这行代码的看法:

invoke GetWindowText,EditIn1ID, eax, 10

invoke GetWindowText中,这行代码调用GetWindowText函数复制输入值。

EditIn1ID此代码是我的文本框的唯一ID,只是按钮具有此特定值。

eax用于计算操作,也许它将用于额外操作。

有些人也使用esi和edi,但我从来没有遇到过这段代码我不知道如果它们与eax和ebx略有不同,我用Google搜索了它的含义但我怀疑是否可以在我的代码中使用它,所以,我不要使用它。

PLS。建议我,谢谢。

1 个答案:

答案 0 :(得分:0)

我在您的代码中看到了许多问题:

invoke CreateWindowEx, WS_EX_CLIENTEDGE, addr EditClassName, NULL, WS_CHILD or WS_VISIBLE, 10, 10, 120, 30, hWnd, EditIn1ID, hInstance, NULL

来自MSDN:

HWND WINAPI CreateWindowEx(
  _In_     DWORD     dwExStyle,
  _In_opt_ LPCTSTR   lpClassName,
  _In_opt_ LPCTSTR   lpWindowName,
  _In_     DWORD     dwStyle,
  _In_     int       x,
  _In_     int       y,
  _In_     int       nWidth,
  _In_     int       nHeight,
  _In_opt_ HWND      hWndParent,
  _In_opt_ HMENU     hMenu,
  _In_opt_ HINSTANCE hInstance,
  _In_opt_ LPVOID    lpParam
);
     

对于子窗口,hMenu指定子窗口标识符,即对话框控件用于通知其父级事件的整数值。应用程序确定子窗口标识符;对于具有相同父窗口的所有子窗口,它必须是唯一的。

根据您在问题中显示的代码,ID在此时未初始化。 传递的内容,因为ID是32位值,对于您创建的每个子窗口都是唯一的。

类似的东西:

EditIn1ID dd 1234
EditIn2ID dd 1235
EditOutID dd 1236

然后你需要添加一个或多个新变量来保存你读取的字符串。

invoke GetWindowText,EditIn1ID, eax, 10

GetWindowText的第一个参数应该是HWND,第二个参数应该是指向应该写入文本的缓冲区的指针。 EditIn1ID不是HWNDHWND是您存储在hEditIn1中的那个),而eax并未指向此处的任何缓冲区可以说。

invoke atodw, addr EditIn1ID

atodw将字符串的地址作为参数。同样,EditIn1ID应该是子窗口ID,而不是字符串。

  

我没有使用对话框,所以也许我会坚持使用GetWindowText函数。

来自documentation for GetDlgItem

  

您可以将 GetDlgItem 功能与任何父子窗口对一起使用,而不仅仅使用对话框。只要hDlg参数指定父窗口并且子窗口具有唯一标识符(由创建子窗口的 CreateWindow CreateWindowEx 函数中的hMenu参数指定) ),

我希望GetDlgItemText也是如此。因此,您应该可以这样做:

invoke GetDlgItemText, hMainWindow, EditIn1ID, ADDR my_string_buffer, 10
相关问题