0

Please bare with my knowledge I am new to assembly language.

I have a code here that add the value of the two textbox and display the result on the third one when I hit the button.

I tried to construct argument using the GetWindowText command but it didn't display anything sometimes it crashes, I look into the web with the same program I am working, but I only found this one From stackoverflow the difference is he use the GetDlgItemTextas I read on the Microsoft Website it retrieves the title or text associated with a control in a dialog box, but I am not using a dialog box so maybe I will just stick to the GetWindowText function.

Here is the code I made, but to be honest I dunno what is going on here I just made it up because I have no idea how to construct an argument for GetWindowText function.

Some of the code you are seeing there is a recycled code from the program that I work a few days ago which is a simple addition operation, which is when I input two values in a console it add the number and display the result. Now, I am trying to do it again but with the use of textbox and button but I can't get it right.

The Deceleration:

.data?

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


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

The Textbox and the Button function

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

Here's What I think of this line of code:

invoke GetWindowText,EditIn1ID, eax, 10

in invoke GetWindowText this line of code calls the function GetWindowText which copies the input value.

EditIn1ID This code is the unique ID for my textbox just so that the button has this specific value.

eax is for calculation operation, maybe it will be use in addition operation.

Some also use esi and edi but I never encounter this code I dunno if they are slightly the same with eax and ebx, I googled the meaning of it but I am skeptical if I can use it here in my code so, I refrain from using it.

Pls. advice me, thanks.

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

次に、読み取った文字列を保持するために 1 つ以上の新しい変数を追加する必要があります。


invoke GetWindowText,EditIn1ID, eax, 10

の最初の引数は でGetWindowTextあると想定されHWND、2 番目の引数はテキストが書き込まれるバッファへのポインタである必要があります。EditIn1IDHWND( にHWND保存したものですhEditIn1)eaxではなく、私が知る限り、ここではどのバッファも指していません。


invoke atodw, addr EditIn1ID

atodw引数として文字列のアドレスを取ります。繰り返しEditIn1IDますが、文字列ではなく、子ウィンドウ ID であると想定されています。


私はダイアログ ボックスを使用していないので、おそらく GetWindowText 関数に固執します。

ドキュメントからGetDlgItem:

GetDlgItem関数は、ダイアログ ボックスだけでなく、任意の親子ウィンドウ ペアで使用できます。hDlg パラメーターが親ウィンドウを指定し、子ウィンドウが (子ウィンドウを作成したCreateWindowまたはCreateWindowEx関数の hMenu パラメーターで指定されたように) 一意の識別子を持っている限り、

についても同じことが当てはまると思いますGetDlgItemText。したがって、次のことができるはずです。

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