请相信我不熟悉汇编语言。
我这里有一个代码,可以添加两个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。建议我,谢谢。
答案 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
不是HWND
(HWND
是您存储在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