0

请用我的知识暴露我是汇编语言的新手。

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

我尝试使用该GetWindowText命令构造参数,但有时它不会显示任何内容,它有时会崩溃,我用我正在工作的相同程序查看网络,但我只从 stackoverflow中找到了这个,不同之处在于他使用GetDlgItemText我继续阅读的Microsoft 网站它在对话框中检索与控件关联的标题或文本,但我没有使用对话框,所以也许我会坚持使用该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 略有相同,我用谷歌搜索了它的含义,但我怀疑是否可以在我的代码中使用它,所以我避免使用它。

请。给我建议,谢谢。

4

1 回答 1

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

for 的第一个参数GetWindowText应该是 a HWND,第二个参数应该是指向应该写入文本的缓冲区的指针。EditIn1ID不是 a HWND(theHWND是您存储的那个hEditIn1),eax据我所知,这里没有指向任何缓冲区。


invoke atodw, addr EditIn1ID

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


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

文档中GetDlgItem

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

我希望对于GetDlgItemText. 因此,您应该能够:

invoke GetDlgItemText, hMainWindow, EditIn1ID, ADDR my_string_buffer, 10
于 2015-07-06T05:41:23.520 回答