2015-07-06 6 views
0

Голосование с моими знаниями Я новичок в языке ассемблера.Как построить аргумент для GetWindowText на языке ассемблера Masm32?

У меня есть код, который добавляет значение двух textbox и отображает результат на третьем, когда я нажимаю кнопку.

Я попытался построить аргумент с помощью команды GetWindowText, но он ничего не отображал, иногда он сбой, я смотрю в сеть с той же программой, в которой я работаю, но я нашел только этот From stackoverflow. Разница заключается в том, что он использует GetDlgItemText как я читал на Microsoft Website, он извлекает заголовок или текст, связанный с элементом управления, в диалоговом окне, но я не использую диалоговое окно, поэтому, возможно, я просто буду придерживаться функции 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 Этот код является уникальным идентификатором для моего текстового поля, так что кнопка имеет это конкретное значение.

eax для расчета операции, возможно, это будет использоваться в дополнение к операции.

Некоторые также используют esi и edi, но я никогда не сталкиваюсь с этим кодом. Я не знаю, если они немного совпадают с eax и ebx, я искал смысл этого, но я скептически отношусь, если я могу использовать его здесь в своем коде, Я воздержусь от его использования.

Pls. советую мне, спасибо.

ответ

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 определяет идентификатор дочернего окна, целочисленное значение, используемое с помощью диалогового окна, чтобы уведомлять родителя о событиях. Приложение определяет идентификатор дочернего окна; он должен быть уникальным для всех дочерних окон с одним и тем же родительским окном.

На основании кода, который вы указали в своем вопросе, идентификаторы неинициализированы в этой точке. То, что вам должно быть, должно быть передано, так как идентификатор представляет собой 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 должен быть идентификатором дочернего окна, а не строкой.


Я не использую диалоговое окно, так что, возможно, я просто придерживаться функции GetWindowText.

Из documentation for GetDlgItem:

Вы можете использовать функциюGetDlgItem с любого окна пары родитель-ребенок, а не только с диалоговыми окнами. До тех пор, пока параметр hDlg задает родительское окно и дочернее окно имеет уникальный идентификатор (как указано в параметре HMenu в CreateWindow или CreateWindowEx функции, которая создала дочернее окно),

Я бы ожидайте того же, что и для GetDlgItemText. Следовательно, вы должны уметь:

invoke GetDlgItemText, hMainWindow, EditIn1ID, ADDR my_string_buffer, 10 
+0

спасибо, я постараюсь работать над этим, надеясь, что он будет работать на этот раз. –