Assembler + WinApi

Узнай цену своей работы

Формулировка задачи:

Не получается соединить два модуля(один - ассемблер, второй - winapi), ошибки LNK2019, LNK1120. Может у кого-то был уже подобный опыт?
Листинг программы
  1. #include "stdafx.h"
  2. #include "assemANDwinapi.h"
  3. extern "C" void StrDel(char*a, int m);
  4. #define MAX_LOADSTRING 100
  5. #define ID_EDIT 1001
  6. #define ID_EDIT1 1003
  7. #define ID_BUTTON 1002
  8. // Global Variables:
  9. char *chint = new char[20];
  10. char *chBuff;
  11. int n;
  12. static HDC hdc;
  13. HINSTANCE hInst; // current instance
  14. WCHAR szTitle[MAX_LOADSTRING]; // The title bar text
  15. WCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name
  16. // Forward declarations of functions included in this code module:
  17. ATOM MyRegisterClass(HINSTANCE hInstance);
  18. BOOL InitInstance(HINSTANCE, int);
  19. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  20. INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
  21. int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
  22. _In_opt_ HINSTANCE hPrevInstance,
  23. _In_ LPWSTR lpCmdLine,
  24. _In_ int nCmdShow)
  25. {
  26. UNREFERENCED_PARAMETER(hPrevInstance);
  27. UNREFERENCED_PARAMETER(lpCmdLine);
  28. // TODO: Place code here.
  29. // Initialize global strings
  30. LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
  31. LoadStringW(hInstance, IDC_ASSEMANDWINAPI, szWindowClass, MAX_LOADSTRING);
  32. MyRegisterClass(hInstance);
  33. // Perform application initialization:
  34. if (!InitInstance (hInstance, nCmdShow))
  35. {
  36. return FALSE;
  37. }
  38. HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_ASSEMANDWINAPI));
  39. MSG msg;
  40. // Main message loop:
  41. while (GetMessage(&msg, nullptr, 0, 0))
  42. {
  43. if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
  44. {
  45. TranslateMessage(&msg);
  46. DispatchMessage(&msg);
  47. }
  48. }
  49. return (int) msg.wParam;
  50. }
  51.  
  52. ATOM MyRegisterClass(HINSTANCE hInstance)
  53. {
  54. WNDCLASSEXW wcex;
  55. wcex.cbSize = sizeof(WNDCLASSEX);
  56. wcex.style = CS_HREDRAW | CS_VREDRAW;
  57. wcex.lpfnWndProc = WndProc;
  58. wcex.cbClsExtra = 0;
  59. wcex.cbWndExtra = 0;
  60. wcex.hInstance = hInstance;
  61. wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ASSEMANDWINAPI));
  62. wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
  63. wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  64. wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_ASSEMANDWINAPI);
  65. wcex.lpszClassName = szWindowClass;
  66. wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
  67. return RegisterClassExW(&wcex);
  68. }
  69. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  70. {
  71. hInst = hInstance; // Store instance handle in our global variable
  72. HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
  73. CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
  74. if (!hWnd)
  75. {
  76. return FALSE;
  77. }
  78. ShowWindow(hWnd, nCmdShow);
  79. UpdateWindow(hWnd);
  80. return TRUE;
  81. }
  82. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  83. {
  84. static HWND hEdit, hEdit1, hButton;
  85. switch (message)
  86. {
  87. case WM_CREATE:
  88. //if(message==LOWORD(wParam))
  89. hEdit = CreateWindow("edit", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT,
  90. 80, 10, 250, 20, hWnd, (HMENU)ID_EDIT, hInst, NULL);
  91. hEdit1 = CreateWindow("edit", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT,
  92. 400, 10, 420, 20, hWnd, (HMENU)ID_EDIT1, hInst, NULL);
  93. hButton = CreateWindow("button", "ENTER", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
  94. 87, 45, 237, 100, hWnd, (HMENU)ID_BUTTON, hInst, NULL);
  95. break;
  96. case WM_COMMAND:
  97. {
  98. int wmId = LOWORD(wParam);
  99. // Parse the menu selections:
  100. switch (wmId)
  101. {
  102. case ID_BUTTON:
  103. SendMessage(hEdit, EM_GETLINE, 0, (LPARAM)chint);
  104. n = atoi(chint);
  105. chBuff = new char[n];
  106. SendMessage(hEdit, EM_GETLINE, 0, (LPARAM)chBuff);
  107. StrDel(chBuff,n);
  108. TextOut(hdc, 80, 152, (LPSTR)chBuff, n);
  109. break;
  110. case IDM_ABOUT:
  111. DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
  112. break;
  113. case IDM_EXIT:
  114. DestroyWindow(hWnd);
  115. break;
  116. default:
  117. return DefWindowProc(hWnd, message, wParam, lParam);
  118. }
  119. }
  120. break;
  121. case WM_PAINT:
  122. {
  123. PAINTSTRUCT ps;
  124. HDC hdc = BeginPaint(hWnd, &ps);
  125. TextOut(hdc, 10, 12, "ENTER: ", 7);
  126. TextOut(hdc, 10, 152,"OUTPUT: ", 8);
  127. // TODO: Add any drawing code that uses hdc here...
  128. EndPaint(hWnd, &ps);
  129. }
  130. break;
  131. case WM_DESTROY:
  132. PostQuitMessage(0);
  133. break;
  134. default:
  135. return DefWindowProc(hWnd, message, wParam, lParam);
  136. }
  137. return 0;
  138. }
  139. // Message handler for about box.
  140. INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  141. {
  142. UNREFERENCED_PARAMETER(lParam);
  143. switch (message)
  144. {
  145. case WM_INITDIALOG:
  146. return (INT_PTR)TRUE;
  147. case WM_COMMAND:
  148. if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
  149. {
  150. EndDialog(hDlg, LOWORD(wParam));
  151. return (INT_PTR)TRUE;
  152. }
  153. break;
  154. }
  155. return (INT_PTR)FALSE;
  156. }
//------------------------------------модуль на ассемблере-------------------------------------------
Листинг программы
  1. .386
  2. .model flat
  3. .data
  4. .code
  5. PUBLIC _StrDel
  6. _StrDel PROC
  7. push edi
  8. push ebx
  9. push esi
  10. mov edx, [esp+20]
  11. mov ecx, [esp+16]
  12. mov edi, [edp+20]
  13. xor eax, eax
  14. mov al, ' '
  15. cld
  16. ;-----------------------------------------------//
  17. repe scasb
  18. jecxz c4
  19. ;-----------------------------------------------//
  20. mov ebx, edi
  21. dec ebx
  22. repne scasb
  23. push ecx
  24. mov ecx, edi
  25. sub ecx, ebx
  26. push edi
  27. mov edi, edx
  28. mov esi, ebx
  29. rep movsb
  30. mov edx, edi
  31. pop edi
  32. pop ecx
  33. ;-----------------------------------------------//
  34. cmp ecx, 0
  35. jnz c1
  36. ;-----------------------------------------------//
  37. c1 :
  38. repe scasb
  39. jecxz c4
  40. ;-----------------------------------------------//
  41. mov ebx, edi
  42. dec ebx
  43. cmp[ebx], ';'
  44. jne m1
  45. dec edx
  46. ;-----------------------------------------------//
  47. m1 :
  48. repne scasb
  49. ;-----------------------------------------------//
  50. push ecx
  51. mov ecx, edi
  52. sub ecx, ebx
  53. push edi
  54. mov edi, edx
  55. mov esi, ebx
  56. rep movsb
  57. mov edx, edi
  58. pop edi
  59. pop ecx
  60. ;-----------------------------------------------//
  61. cmp ecx, 0
  62. jnz c1
  63. ;-----------------------------------------------//
  64. c4 :
  65. ;-----------------------------------------------//
  66. mov edi, [esp+20]
  67. add edi, [esp+16]
  68. cmp edx, edi
  69. je c5
  70. cmp[edx - 1], ' '
  71. jnz c2
  72. dec edx
  73. ;-----------------------------------------------//
  74. c2 :
  75. mov[edx], 0
  76. c5 :
  77. pop esi
  78. pop ebx
  79. pop edi
  80. ret
  81. _StrDel endp
  82. end

Решение задачи: «Assembler + WinApi»

textual
Листинг программы
  1. mov edi, [edp+20]

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.286 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут