w.txt 36 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157
  1. 1. Создание и отладка файла DLL. Для демонстрации работы написать две элементарные функции в библиотеке и вызвать их из основной программы
  2. Создаем два проекта, один настраиваем как длл вин апи(подсистему меняем на винду, а в общих настройках exe на dll), второй как обычно. В коде программы, где path прописываем путь к длл.
  3. Код длл:
  4. #include <Windows.h>
  5. BOOL WINAPI DLLMain()
  6. {
  7. return 0;
  8. }
  9. __declspec(dllexport) int sum(int a, int b);//разрешение на экспорт функций из длл
  10. __declspec(dllexport) int razn(int a, int b);
  11. int sum(int a, int b)
  12. {
  13. return a + b;
  14. }
  15. int razn(int a, int b)
  16. {
  17. return a - b;
  18. }
  19. Код программы:
  20. #include <stdio.h>
  21. #include <Windows.h>
  22. #define PATH L"C://Users//Dima//source//repos//Project1//x64//Debug//Project2.dll"//путь меняется
  23. typedef int(cdecl* sum)(int a, int b);
  24. typedef int(cdecl* razn)(int a, int b);// экспорт функций
  25. int main()
  26. {
  27. HINSTANCE hMyDLL;
  28. if ((hMyDLL = LoadLibrary(PATH)) == NULL) return 1;// проверка подключения к длл
  29. sum s = (sum)GetProcAddress(hMyDLL, "sum");
  30. razn r = (razn)GetProcAddress(hMyDLL, "razn");//вызов фунций
  31. printf("%d\n", s(5, 2));
  32. printf("%d", r(5, 2));
  33. FreeLibrary(hMyDLL);// очистка
  34. }
  35. 2. Программа для считывания и записи строкового значения с использованием текстового файла. Для работы с файлами используются функции WinAPI(WinAPI)
  36. #include <Windows.h>
  37. #include <stdio.h>
  38. int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  39. {
  40. HANDLE file = CreateFile(L"1.txt", GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);//открываем для чтения
  41. DWORD size = 100,//кол-во символов которые надо прочитать
  42. bytes;//типо счетчик реально прочитанных символов
  43. char* text = calloc(size + 1, 1);//буфер куда записывается прочитанное
  44. if (file != INVALID_HANDLE_VALUE) //если файл есть
  45. {
  46. ReadFile(file, text, size, &bytes, NULL);//читаем ебать
  47. CloseHandle(file);//закрываем нахуй ибо нахуй он нам нужен теперь
  48. }
  49. file = CreateFile(L"answer.txt", GENERIC_WRITE, 0, NULL,
  50. CREATE_ALWAYS, //если нет файла создаст, если есть перезапишет(удалит и создаст заново)
  51. FILE_ATTRIBUTE_NORMAL, NULL);//открываем для записи
  52. WriteFile(file, text, size, &bytes, NULL);//записываем (size и bytes как и при чтении)
  53. }
  54. 3. Получение названия клавиши с использованием функции GetKeyNameText (Windows HOOK). Название клавиши выводить в MessageBox
  55. #include <Windows.h>
  56. #include <stdio.h>
  57. LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)// метод получения клавиши
  58. {
  59. PKBDLLHOOKSTRUCT hHook = (PKBDLLHOOKSTRUCT)lParam; // создание хука
  60. // Если событие - нажатие клавиши
  61. if (nCode == HC_ACTION && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN))
  62. {
  63. KBDLLHOOKSTRUCT* p = (KBDLLHOOKSTRUCT*)lParam;
  64. // Получаем название нажатой клавиши
  65. TCHAR szKeyName[256];
  66. DWORD iKey = MapVirtualKey(p->vkCode, NULL) << 16;// получение кода клавиши
  67. if (!((p->vkCode <= 32))) {
  68. iKey |= 0x1 << 24;
  69. }
  70. GetKeyNameText(iKey, szKeyName, 256);
  71. // Выводим название клавиши в MessageBox
  72. MessageBox(NULL, szKeyName, L"Key Pressed", MB_OK);
  73. }
  74. return CallNextHookEx(hHook, nCode, wParam, lParam);
  75. }
  76. int main()
  77. {
  78. HHOOK hHook;
  79. // Устанавливаем хук на обработку событий клавиатуры
  80. hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, 0);
  81. // Обрабатываем сообщения окна
  82. MSG msg;
  83. while (GetMessage(&msg, NULL, 0, 0))
  84. {
  85. TranslateMessage(&msg);
  86. DispatchMessage(&msg);
  87. }
  88. // Удаляем хук
  89. UnhookWindowsHookEx(hHook);
  90. return 0;
  91. }
  92. 4. Получение кода клавиши в формате ASCII и использованием Windows HOOK. Название клавиши выводить в MessageBox
  93. #include <Windows.h>
  94. #include <stdio.h>
  95. LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
  96. {
  97. PKBDLLHOOKSTRUCT hHook = (PKBDLLHOOKSTRUCT)lParam;
  98. // Если событие - нажатие клавиши
  99. if (nCode == HC_ACTION && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN))
  100. {
  101. KBDLLHOOKSTRUCT* p = (KBDLLHOOKSTRUCT*)lParam;
  102. // Получаем название нажатой клавиши
  103. TCHAR szKeyName[256];
  104. int iKey = MapVirtualKeyA(p->vkCode, NULL);//получение кода клавиши
  105. WCHAR procID[256];
  106. swprintf_s(procID, 256, L"%d", iKey);
  107. MessageBox(NULL, procID, L"Key Pressed", MB_OK);
  108. }
  109. return CallNextHookEx(hHook, nCode, wParam, lParam);
  110. }
  111. int main()
  112. {
  113. HHOOK hHook;
  114. // Устанавливаем хук на обработку событий клавиатуры
  115. hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, 0);
  116. // Обрабатываем сообщения окна
  117. MSG msg;
  118. while (GetMessage(&msg, NULL, 0, 0))
  119. {
  120. TranslateMessage(&msg);
  121. DispatchMessage(&msg);
  122. }
  123. // Удаляем хук
  124. UnhookWindowsHookEx(hHook);
  125. return 0;
  126. }
  127. 5. Программа для преобразования числа в строку и склейки двух строк. Разработать без использования системных функций
  128. #include <Windows.h>
  129. #include <stdio.h>
  130. char* int_to_string(int n)
  131. {
  132. int nDigits = 1; // счетчик разрядов
  133. // Определяем, сколько разрядов имеет число
  134. int new_n = n;
  135. while (new_n / 10 != 0)// считаем разряды
  136. {
  137. nDigits++;
  138. new_n /= 10;
  139. }
  140. char* s = "";// задаем переменную в которую записывать будем
  141. int i = 0;
  142. if (n < 0) {
  143. n = -n;
  144. nDigits++;
  145. }
  146. s = malloc(nDigits);// выделение памяти для переменной
  147. for (i; i < nDigits; i++)
  148. {
  149. s[i] = n % 10 + '0';
  150. if (n == 0) {
  151. s[i] = '-';
  152. }
  153. else {
  154. n /= 10;
  155. }
  156. }
  157. s[nDigits] = '\0';
  158. int j;
  159. char c;
  160. for (i = 0, j = nDigits - 1; i < j; i++, j--) {
  161. c = s[i];
  162. s[i] = s[j];
  163. s[j] = c;
  164. }
  165. return s;// программа не выдает ничего в консоль, смотреть по точке остановы на этой строчке
  166. }
  167. char* Concat(char* str1, char* str2) {
  168. int count = 0;// счетчик символов первой переменной
  169. while (str1[count] != '\0')// считает количество символов первой переменно
  170. count++;
  171. int count2 = 0;// счетчик символов второй переменной
  172. while (str2[count2] != '\0')// считает количество символов второй переменной
  173. count2++;
  174. count += count2;
  175. char* result = malloc(count + 1);// выделение памяти под склеенную строчку
  176. result[count] = '\0';// завершение строчки
  177. count2 = 0;
  178. while (str1[count2] != '\0')// цикл записи первой строчки в новую переменную
  179. {
  180. result[count2] = str1[count2];
  181. count2++;
  182. }
  183. count = 0;
  184. while (str2[count] != '\0')// цикл записи второй строчки в новую переменную
  185. {
  186. result[count2] = str2[count];
  187. count++;
  188. count2++;
  189. }
  190. return result;// смотреть результат по точке остановы на этой строке
  191. }
  192. int main()
  193. {
  194. int_to_string(9);
  195. Concat("dfb", "sbvdb");
  196. }
  197. 6. Программа с использованием нескольких программных модулей (каждый модуль должен располагаться в отдельном файле .c). В рамках модулей должна быть как минимум одна пользовательская функция и одна структура. Также для этих модулей должен быть написан заголовочный файл, содержащий всю необходимую информацию для корректного функционирования модулей
  198. Создаем в проекте три файла с и один заголовочный h. Вставляем туда код снизу и исключаем из проекта файл структуры и функции(пкм по файлу – исключить из проекта)
  199. Основной код:
  200. #include "Header.h"
  201. int main()
  202. {
  203. struct s* us = calloc(1, sizeof(struct s));
  204. us->a = 10;
  205. us->b = 2;
  206. printf("%d\n", sum(us));
  207. }
  208. Заголовочный:
  209. #pragma once
  210. #define _CRT_SECURE_NO_WARNINGS
  211. #include <stdio.h>
  212. #include <malloc.h>
  213. #include <Windows.h>
  214. #include "Struct.c"
  215. #include "Func.c"
  216. Функция:
  217. sum(struct s* us)
  218. {
  219. return us.a + us.b;// передаем параметры структуры в переменные
  220. }// надо точки ставить, они потом превратятся в стрелки
  221. Структура:
  222. struct s
  223. {
  224. int a;
  225. int b;
  226. };
  227. 7. Программа для преобразования строки в число. Строка хранится в виде указателя LPWSTR. Реализовать без использования системных функций
  228. #include <Windows.h>
  229. int GetLevels(int a, int n)// функция для добавления нулей в соответствии с их количеством
  230. {
  231. for (size_t i = 1; i < n; i++)
  232. {
  233. a *= 10;
  234. }
  235. return a;
  236. }
  237. int string_to_int(LPWSTR str) // основная функция{
  238. int result = 0; //ответ
  239. int is_negative = 0;// проверка на минус
  240. int i = 0;
  241. int count = 0;
  242. if (str[i] == L'-') // проверка на минус{
  243. is_negative = 1;
  244. i++;
  245. }
  246. int index = i;
  247. while (str[index] != '\0') // счет количества символов в строке
  248. {
  249. count++;
  250. index++;
  251. }
  252. while (str[i] != L'\0') {
  253. if (str[i] >= L'0' || str[i] <= L'9') // проверка, число ли это{
  254. result += (int)(str[i] - '0') * (GetLevels(10, count) / 10);// посимвольно переводит строку в число
  255. count--;
  256. }
  257. i++;
  258. }
  259. if (is_negative) // если отрицательное, меняет знак на -{
  260. result = -result;
  261. }
  262. return result; // смотреть результат по этой строке по точке остановы
  263. }
  264. int main()
  265. {
  266. string_to_int(L"-325");
  267. }
  268. 8. Программа для записи строки в системный буфер обмена
  269. #include <Windows.h>
  270. #include <stdio.h>
  271. void CBInput(LPWSTR text)
  272. {
  273. HANDLE hMem = GlobalAlloc(GMEM_MOVEABLE, (wcslen(text) + 1) * sizeof(LPWSTR)); // выделение памяти под результат
  274. memcpy(GlobalLock(hMem), text, (wcslen(text) + 1) * sizeof(LPWSTR));
  275. GlobalUnlock(hMem);
  276. OpenClipboard(NULL);
  277. EmptyClipboard();
  278. SetClipboardData(CF_UNICODETEXT, hMem);// занесение строки в буфер обмена
  279. CloseClipboard();
  280. }
  281. int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  282. {
  283. CBInput(L"yu,yu,");// передаем строку, которая попадет в буфер
  284. }
  285. 9. Программа для считывания данных из системного буфера обмена
  286. #include <Windows.h>
  287. #include <stdio.h>
  288. LPWSTR CBOuput()
  289. {
  290. LPWSTR text = NULL; // куда запишется результат
  291. OpenClipboard(NULL);
  292. HANDLE CBtext = GetClipboardData(CF_UNICODETEXT); // метод получения содержимого из буфера обмена
  293. text = (LPWSTR)GlobalLock(CBtext); // приравнивание содержимого к переменной
  294. GlobalUnlock(CBtext);
  295. CloseClipboard();
  296. return text; // здесь по точке остановы можно посмотреть результат
  297. }
  298. int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  299. {
  300. CBOuput();
  301. }
  302. 10. Создание программы с критической секцией. Программа должна содержать минимум два потока. Использование критической секции в функции потока должно быть обосновано.
  303. #include <Windows.h>
  304. #include <stdio.h>
  305. CRITICAL_SECTION cs; // объявление критической секции
  306. int count = 0;
  307. DWORD WINAPI thread_func(int thread_num) {
  308. for (int i = 0; i < 10; i++) {
  309. EnterCriticalSection(&cs); // запуск критической секции
  310. printf("Thread %d: %d\n", thread_num, count);
  311. count++;
  312. LeaveCriticalSection(&cs); // закрытие критической секции
  313. Sleep(100);
  314. }
  315. return 0;
  316. }
  317. int main() {
  318. InitializeCriticalSection(&cs); // создание критической секции
  319. HANDLE thread1 = CreateThread(NULL, 0, thread_func, 1, 0, NULL);// создание потоков и передача в них функции
  320. HANDLE thread2 = CreateThread(NULL, 0, thread_func, 2, 0, NULL);
  321. WaitForSingleObject(thread1, INFINITE); // не заканчивать работу потоков, пока не закончится работа программы
  322. WaitForSingleObject(thread2, INFINITE);
  323. DeleteCriticalSection(&cs); // удаление
  324. return 0;
  325. }
  326. 11. Программа для считывания нескольких числовых значений из строки и из записи в числовой массив (разделитель - пробел). Количество значений в строке заранее неизвестно.
  327. #include <stdio.h>
  328. #include <Windows.h>
  329. int pow(int a, int b) //
  330. {
  331. for (size_t i = 0; i < b; i++)
  332. {
  333. a *= 10;
  334. }
  335. return a;
  336. }
  337. int main()
  338. {
  339. LPSTR str = "10 52 654";
  340. int index = 0;
  341. int count = 0;
  342. int countall = 0;
  343. while (str[index] != L'\0')
  344. {
  345. if (str[index] == L' ')
  346. {
  347. count++;
  348. }
  349. countall++;
  350. index++;
  351. }
  352. index = 0;
  353. int* mass = calloc(count + 1, sizeof(int));
  354. int* countt = calloc(countall, sizeof(int));
  355. int* min = calloc(count + 1, sizeof(int));
  356. int ind = 0;
  357. for (int i = 0; i < count + 1; i++)
  358. {
  359. countt[i] = 0;
  360. }
  361. while (str[index] != L'\0')
  362. {
  363. while (str[index] != L' ')
  364. {
  365. if (str[index] == L'\0')
  366. {
  367. break;
  368. }
  369. countt[ind] += 1;
  370. if (str[index] == L'-')
  371. {
  372. min[ind] = 1;
  373. }
  374. index++;
  375. }
  376. ind++;
  377. index++;
  378. }
  379. index = 0;
  380. int ii = 0;
  381. int iii = 0;
  382. int pr = 0;
  383. for (int i = 0; i < count + 1; i++)
  384. {
  385. if (str[index] != L' ')
  386. {
  387. iii = countt[i];
  388. while (countt[i] > ii)
  389. {
  390. if (str[index] != L'-')
  391. {
  392. pr = (int)(str[index] - '0');
  393. mass[i] += pow(pr, iii) / 10;
  394. ii++;
  395. index++;
  396. iii--;
  397. }
  398. else
  399. {
  400. ii++;
  401. index++;
  402. iii--;
  403. }
  404. }
  405. ii = 0;
  406. }
  407. else
  408. {
  409. i--;
  410. }
  411. index++;
  412. }
  413. for (size_t i = 0; i < count + 1; i++)
  414. {
  415. if (min[i] == 1)
  416. {
  417. mass[i] = -mass[i];
  418. }
  419. }
  420. for (int i = 0; i < count + 1; i++)
  421. {
  422. printf("%d\n", mass[i]);
  423. }
  424. }
  425. 12. Запись и считывание строковых параметров в системный реестр.
  426. #include <Windows.h>
  427. #include <stdio.h>
  428. int main()
  429. {
  430. HKEY hkey;
  431. HKEY hMyKey;
  432. RegOpenKeyW(HKEY_CURRENT_USER, NULL, &hkey); // выбор главной ветви реестра
  433. if (RegCreateKeyW(hkey, L"MyKey", &hMyKey) == ERROR_SUCCESS) // условие создания ключа
  434. {
  435. if (RegSetValueEx(hMyKey, L"test", 0, REG_SZ, L"Message", 8 * sizeof(WCHAR)) == ERROR_SUCCESS) // условие создания строкового параметра
  436. {
  437. WCHAR text[256];
  438. DWORD size = sizeof(WCHAR) * 256; // выделение памяти под считывание
  439. if (RegGetValueW(hMyKey, NULL, L"test", RRF_RT_REG_SZ, NULL, text, &size) == ERROR_SUCCESS) // условие для считывания с проверкой на исключение
  440. {
  441. MessageBoxW(NULL, text, L"YES", MB_OK); // передача значения из реестра в бокс
  442. }
  443. }
  444. }
  445. }
  446. 13. Обработка нажатия клавиши мыши в системе (выписать в messagebox какая клавиша нажата и сколько раз)
  447. #include <Windows.h>
  448. #include <stdio.h>
  449. HHOOK hHook = NULL;
  450. int count;
  451. int count1;
  452. WPARAM ButtonCode;
  453. LPWSTR str[256];
  454. LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam) // метод считывания нажатия
  455. {
  456. if (nCode == HC_ACTION) // проверка на нажатие мыши
  457. {
  458. switch (wParam)
  459. {
  460. case WM_LBUTTONDOWN:// обработка левой кнопки мыши
  461. if (ButtonCode != wParam)
  462. ButtonCode = wParam;
  463. count++;
  464. swprintf_s(str, 256, L"Левая клавиша мыши нажата %d раз", count);
  465. MessageBox(NULL, str, L"", MB_OK);
  466. break;
  467. case WM_RBUTTONDOWN: // обработка правой кнопки мыши
  468. if (ButtonCode != wParam)
  469. ButtonCode = wParam;
  470. count1++;
  471. swprintf_s(str, 256, L"Правая клавиша мыши нажата %d раз", count1);
  472. MessageBox(NULL, str, L"", MB_OK);
  473. break;
  474. }
  475. }
  476. return CallNextHookEx(hHook, nCode, wParam, lParam);
  477. }
  478. int main()
  479. {
  480. hHook = SetWindowsHookEx(WH_MOUSE_LL, MouseProc, NULL, 0); // устанавливаем хук
  481. MSG msg;
  482. while (GetMessage(&msg, NULL, 0, 0)) // цикл для непрерывного перехвата
  483. {
  484. TranslateMessage(&msg);
  485. DispatchMessage(&msg);
  486. }
  487. UnhookWindowsHookEx(hHook); // закрытие хука
  488. return 0;
  489. }
  490. 14. Использование системного буфера обмена для передачи строковых значений между процессами
  491. Основной код:
  492. #define _CRT_SECURE_NO_WARNINGS
  493. #include <stdio.h>
  494. #include <strsafe.h>
  495. #include <Windows.h>
  496. #include < stdlib.h >
  497. LPWSTR ClipboardOutputText();
  498. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine, int nCmdShow)
  499. {
  500. int p = 1;
  501. while (p)
  502. {
  503. ClipboardInputText(L"HeLLO"); //
  504. Sleep(1000);
  505. STARTUPINFO si;
  506. PROCESS_INFORMATION pi = { 0 };
  507. ZeroMemory(&si, sizeof(si));
  508. si.cb = sizeof(si);
  509. ZeroMemory(&pi, sizeof(pi)); // все что сверху это для создания процесса
  510. if (!CreateProcessA(NULL, "C:\\Users\\Dima\\source\\repos\\Project8\\x64\\Debug\\Project1.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))// проверка на запуск процесса
  511. {
  512. }
  513. WaitForSingleObject(pi.hProcess, INFINITE);
  514. CloseHandle(pi.hProcess);
  515. CloseHandle(pi.hThread);
  516. p = 0;
  517. }
  518. return 0;
  519. }
  520. int ClipboardInputText(LPWSTR buffer)// метод для записи строки в буфер обмена
  521. {
  522. DWORD len;
  523. HANDLE hMem;
  524. len = wcslen(buffer) + 1;
  525. hMem = GlobalAlloc(GMEM_MOVEABLE, len * sizeof(LPWSTR));
  526. memcpy(GlobalLock(hMem), buffer, len * sizeof(LPWSTR));
  527. GlobalUnlock(hMem);
  528. OpenClipboard(0);
  529. EmptyClipboard();
  530. SetClipboardData(CF_UNICODETEXT, hMem);
  531. CloseClipboard();
  532. return 0;
  533. }
  534. Получение и вывод в процессе
  535. #define _CRT_SECURE_NO_WARNINGS
  536. #include <stdio.h>
  537. #include <strsafe.h>
  538. #include <Windows.h>
  539. #include < stdlib.h >
  540. LPWSTR ClipboardOutputText();
  541. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine, int nCmdShow)
  542. {
  543. int p = 1;
  544. while (p)
  545. {
  546. LPSTR* Data = ClipboardOutputText();
  547. MessageBoxW(NULL, Data, NULL, MB_OK | MB_ICONWARNING);
  548. Sleep(1000);
  549. p = 0;
  550. }
  551. return 0;
  552. }
  553. TCHAR* ClipboardOutputText()// метод для получения данных из буфера обмена
  554. {
  555. TCHAR* Mess = NULL;
  556. OpenClipboard(NULL); //открыть буфер обмена
  557. HANDLE hClipboardData = GetClipboardData(CF_UNICODETEXT); //записать в буфер обмена данные соответствующего типа
  558. Mess = (TCHAR*)GlobalLock(hClipboardData); //считать из глобального участка памяти, привести это все к строке
  559. GlobalUnlock(hClipboardData); //освободить глобальные участки памяти
  560. CloseClipboard(); //закрыть буфер обмена, сделать его доступным для других приложений
  561. EmptyClipboard(); //очистить буфер обмена
  562. return Mess;
  563. }
  564. 15. Запись и считывание числовых параметров в системный реестр
  565. #define _CRT_SECURE_NO_WARNINGS
  566. #include <Windows.h>
  567. #include <stdio.h>
  568. #include <time.h>
  569. HANDLE hConsole;
  570. main()
  571. {
  572. DWORD st = 100;
  573. DWORD size = sizeof(st);
  574. HKEY hMyKey;
  575. if (RegCreateKeyW(HKEY_CURRENT_USER, L"NewMyKey", &hMyKey) == ERROR_SUCCESS)
  576. {
  577. if (RegSetValueEx(hMyKey, L"nameparamdword", 0, REG_DWORD, (const BYTE*)&st, sizeof(st)) == ERROR_SUCCESS)// то же что и в 12, только с числом (reg dword)
  578. {
  579. if (RegGetValueW(hMyKey, NULL, L"nameparamdword", RRF_RT_DWORD, NULL, (LPBYTE)&st, &size) == ERROR_SUCCESS)
  580. {
  581. WCHAR buf[256];
  582. swprintf_s(buf, 256, L"%d", st);
  583. MessageBox(NULL, buf, L"Оповещение", MB_OK);
  584. }
  585. }
  586. }
  587. }
  588. 16. Разработка программы-секундомера. в одном потоке идет отсчет времени, а в другом осуществляется управление секундомером
  589. #define _CRT_SECURE_NO_WARNINGS
  590. #include <stdio.h>
  591. #include <Windows.h>
  592. int times(long int t)
  593. {
  594. int sec = t;
  595. int min = 0;
  596. int hours = 0;
  597. while (1)
  598. {
  599. Sleep(1000);
  600. sec++;
  601. if (sec == 60)
  602. {
  603. min++;
  604. sec = 0;
  605. if (min == 60)
  606. {
  607. hours++;
  608. min = 0;
  609. if (hours == 24)
  610. {
  611. hours = 0;
  612. }
  613. }
  614. }
  615. system("cls");
  616. printf_s("%d:%d:%d\n", hours, min, sec);
  617. }
  618. }
  619. int main()
  620. {
  621. system("chcp 1251 >null");
  622. DWORD choose = -1;
  623. HANDLE hTread[1];
  624. printf("\n1 - секундомер\n0 - Остановить\n");
  625. while (1)
  626. {
  627. scanf_s("%d", &choose);
  628. switch (choose)
  629. {
  630. case 1:
  631. hTread[0] = CreateThread(NULL, 0, times, 0, NULL, NULL);// запускаем поток с секуномером
  632. break;
  633. case 0:
  634. SuspendThread(hTread[0]);// завершаем
  635. break;
  636. default:
  637. break;
  638. }
  639. }
  640. WaitForSingleObject(hTread, INFINITE);
  641. }
  642. 17. Разработка программы для вычисления факториала в отдельном потоке. В программе должна быть предусмотрена валидация данных.
  643. #define _CRT_SECURE_NO_WARNINGS
  644. #include <stdio.h>
  645. #include <Windows.h>
  646. int FacKU(int n) {
  647. if (n == 0)// проверка
  648. return 1;
  649. if (n < 1)
  650. return 0;
  651. int a = 1;
  652. for (size_t i = 1; i <= n; i++)
  653. {
  654. a *= i;
  655. }
  656. printf("%d\n", a);
  657. return a;
  658. }
  659. main() {
  660. HANDLE hThread;
  661. while (1) {
  662. char str[256];
  663. scanf("%s", str);
  664. int n = atoi(str);
  665. if (n != NULL) {
  666. hThread = CreateThread(NULL, 0, FacKU, n, NULL, NULL);// создание потока
  667. }
  668. }
  669. }
  670. 18. Создание и настройка проекта WinAPI. Вывод сообщения в messagebox. Текст сообщения считывается из текстового файла в кодировке Юникод
  671. #define _CRT_SECURE_NO_WARNINGS
  672. #include <Windows.h>
  673. #include <stdio.h>
  674. int WINAPI WinMain()
  675. {
  676. DWORD d;
  677. HANDLE hFile = CreateFile(L"1.txt",//путь к файлу
  678. GENERIC_READ | GENERIC_WRITE,//флаги на открытие как на чтение, так и на запись
  679. FILE_SHARE_READ | FILE_SHARE_WRITE,//совместный доступ только на чтение
  680. NULL,//структура безопасности по умолчанию
  681. OPEN_ALWAYS,//режим создания файла (открыть, перезаписать и т.п.)
  682. FILE_ATTRIBUTE_NORMAL,//атрибуты файла по умолчанию
  683. NULL);//шаблон файла отсутствует
  684. LPCSTR str = calloc(100, 1);
  685. ReadFile(hFile, str, 100, &d, NULL);
  686. MessageBoxA(NULL, str, NULL, MB_OK);
  687. }
  688. 19. Программа с запуском стороннего процесса. Имя запускаемого процесса выбирается с помощью системного диалогового окна.
  689. 20. Использование условных блоков для анализа значений, возвращаемых системной функцией.
  690. #define _CRT_SECURE_NO_WARNINGS
  691. #include <Windows.h>
  692. #include <stdio.h>
  693. int main()
  694. {
  695. int a = 0;
  696. if (!scanf("%d", &a)) //можно любую системную функцию
  697. {
  698. printf("%s", "no number");
  699. }
  700. else
  701. {
  702. printf("%s", "number");
  703. }
  704. }
  705. 21. Программа с импортом функции из файла DLL. Функция принимает структуру, содержащую координаты двух точек, а возвращает длину отрезка, который образуется этими точками
  706. Основной код программы:
  707. #define PATH L"DLLCode.dll"
  708. typedef double(_cdecl* getSize)(struct cord*);
  709. typedef struct coordinats {
  710. COORD point1;
  711. COORD point2;
  712. }cord;
  713. int main()
  714. {
  715. HINSTANCE hMyDLL;
  716. if ((hMyDLL = LoadLibrary(PATH)) == NULL) return 1;
  717. getSize getSqize = (getSize)GetProcAddress(hMyDLL, "getSize");
  718. cord* cord = malloc(sizeof(cord));
  719. cord->point1.X = 2;
  720. cord->point1.Y = 1;
  721. cord->point2.X = 6;
  722. cord->point2.Y = 4;
  723. double result = getSqize(cord);
  724. FreeLibrary(hMyDLL);
  725. return 0;
  726. }
  727. Код длл
  728. #include <Windows.h>
  729. typedef struct coordinats {
  730. COORD point1;
  731. COORD point2;
  732. }cord;
  733. __declspec(dllimport) double getSize(cord* cord);
  734. BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
  735. {
  736. switch (fdwReason)
  737. {
  738. case DLL_PROCESS_ATTACH:
  739. break;
  740. case DLL_THREAD_ATTACH:
  741. break;
  742. case DLL_THREAD_DETACH:
  743. break;
  744. case DLL_PROCESS_DETACH:
  745. break;
  746. }
  747. return TRUE;
  748. }
  749. double getSize(cord* cord)
  750. {
  751. double d = sqrt((pow(cord->point2.X - cord->point1.X, 2) + pow(cord->point2.Y - cord->point1.Y, 2)), 2);
  752. return d;
  753. }
  754. 22. Отправка и получение данных из именованного канала. Данные содержатся в строковой форме. Перед отправкой следующей строки клиенту необходимо дождаться ответа от сервера.
  755. Код сервера:
  756. #include <Stdio.h>
  757. #include <Windows.h>
  758. int main()
  759. {
  760. system("chcp 1251");
  761. HANDLE hNamePipe;
  762. LPSTR pipeName = L"\\\\.\\pipe\\MyPipe";
  763. DWORD read_buffer = 100;
  764. LPWSTR buffer = calloc(read_buffer, sizeof(char));
  765. char message[100];
  766. DWORD actual_read;
  767. BOOL Connected;
  768. BOOL SuccessRead;
  769. while (1)
  770. {
  771. hNamePipe = CreateNamedPipe(
  772. pipeName,
  773. PIPE_ACCESS_DUPLEX,
  774. PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
  775. PIPE_UNLIMITED_INSTANCES,
  776. 512,
  777. 512,
  778. INFINITE,
  779. NULL);
  780. Connected = ConnectNamedPipe(hNamePipe, NULL);
  781. if (Connected) {
  782. printf("\nКлиент подключился\n");
  783. SuccessRead = ReadFile(hNamePipe, buffer, read_buffer, &actual_read, NULL);
  784. if (SuccessRead) {
  785. printf("\nКлиент пишет: ");
  786. printf(buffer);
  787. printf("\n");
  788. printf("\nВведите сообщение для клиента: ");
  789. gets(message);
  790. buffer = &message;
  791. WriteFile(hNamePipe, buffer, read_buffer, &actual_read, NULL);
  792. }
  793. }
  794. else
  795. {
  796. printf("\nКлиент отключился от сервера");
  797. }
  798. CloseHandle(hNamePipe);
  799. }
  800. }
  801. Код клиента:
  802. #define _CRT_SECURE_NO_WARNINGS
  803. #include <Stdio.h>
  804. #include <Windows.h>
  805. int main()
  806. {
  807. system("chcp 1251");
  808. BOOL flag_awser = TRUE;
  809. char message[100];
  810. DWORD read_buffer = 100;
  811. DWORD actual_read;
  812. DWORD actual_write;
  813. LPWSTR buffer = (CHAR*)calloc(read_buffer, sizeof(char));
  814. HANDLE hNamePipe;
  815. LPSTR pipeName = L"\\\\.\\pipe\\MyPipe";
  816. BOOL SuccessRead;
  817. BOOL isSuccess;
  818. DWORD dwMode = PIPE_READMODE_MESSAGE;
  819. while (1)
  820. {
  821. hNamePipe = CreateFile(pipeName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
  822. isSuccess = SetNamedPipeHandleState(hNamePipe, &dwMode, NULL, NULL);
  823. if (!isSuccess) {
  824. printf("\nСервер не отвечает\n");
  825. flag_awser = TRUE;
  826. }
  827. else
  828. {
  829. if (flag_awser) {
  830. printf("Введите сообщение для сервера: \n");
  831. gets(message);
  832. buffer = &message;
  833. WriteFile(hNamePipe, buffer, read_buffer, &actual_write, NULL);
  834. flag_awser = FALSE;
  835. }
  836. SuccessRead = ReadFile(hNamePipe, buffer, 100, &actual_read, NULL);
  837. if (SuccessRead) {
  838. printf("\nСервер пишет: ");
  839. printf(buffer);
  840. printf("\n");
  841. flag_awser = TRUE;
  842. if (buffer == NULL)
  843. printf("Пусто");
  844. }
  845. }
  846. Sleep(100);
  847. CloseHandle(hNamePipe);
  848. }
  849. }
  850. 23. Создание линейного односвязного списка из n элементов. Значение элемента генерируется случайным образом. Поместить в отдельные указатели адрес минимального и максимального элемента списка. Вывести список и значения минимального и максимального элемента через указатель
  851. #include <Windows.h>
  852. #include <stdio.h>
  853. #include <locale.h>
  854. typedef struct LOS {
  855. int arg;
  856. int min;
  857. int max;
  858. struct LOS* next;
  859. }LOS;
  860. void GetMinMax(LOS* los) {
  861. LOS* head = los;
  862. int max;
  863. int min = los->arg;
  864. while (los) {
  865. if (los->next != NULL) {
  866. int n = los->next->arg;
  867. if (los->arg > n)
  868. max = los->arg;
  869. }
  870. if (min > los->arg)
  871. min = los->arg;
  872. los = los->next;
  873. }
  874. los = head;
  875. los->min = min;
  876. los->max = max;
  877. }
  878. void WriteLOS(LOS* los) {
  879. LOS* head = los;
  880. while (los)
  881. {
  882. printf("значение - %d\n", los->arg);
  883. los = los->next;
  884. }
  885. los = head;
  886. printf("min - %d; max - %d", los->min, los->max);
  887. }
  888. LOS* createLOS(int count) {
  889. LOS* los = calloc(1, sizeof(LOS));
  890. los->arg = rand();
  891. los->next = NULL;
  892. LOS* headCopy, * next;
  893. headCopy = los;
  894. for (size_t i = 0; i < count - 1; i++)
  895. {
  896. next = calloc(1, sizeof(LOS));
  897. next->arg = rand();
  898. headCopy->next = next;
  899. headCopy = next;
  900. }
  901. headCopy->next = NULL;
  902. return los;
  903. }
  904. main() {
  905. setlocale(LC_ALL, "Rus");
  906. LOS* los = createLOS(5);
  907. GetMinMax(los);
  908. WriteLOS(los);
  909. }
  910. 24. Программа для считывания числового значения из файла (с сохранением его в числовом формате). Исходный файл является бинарным
  911. #define _CRT_SECURE_NO_WARNINGS
  912. #include <Windows.h>
  913. #include <stdio.h>
  914. int main()
  915. {
  916. FILE* file = NULL;
  917. int number;
  918. file = fopen("bin.bin", "wb");
  919. if (file == NULL) {
  920. printf("Error opening file");
  921. }
  922. scanf("%d", &number);
  923. fwrite(&number, sizeof(int), 1, file);
  924. fclose(file);
  925. file = fopen("bin.bin", "rb");
  926. if (file == NULL) {
  927. printf("Error opening file");
  928. }
  929. fread(&number, sizeof(int), 1, file);
  930. printf("%d", number);
  931. fclose(file);
  932. }
  933. 25. Создание консольной утилиты, которая печатает список переданных ей аргументов из командной строки. При демонстрации работы программы рассмотреть не менее трех способов передачи аргументов в запускаемый процесс
  934. 26. Создание функции, аргументом которой является указатель на функцию. Создать не менее двух вспомогательных функций и передать их в качестве аргумента исходной функции. Продемонстрировать специфику работы исходной функции в зависимости от переданных параметров
  935. #include <stdio.h>
  936. int main()
  937. {
  938. int (*f)(int, int); // создаем указатель на функцию
  939. int (*f1)(int, int);
  940. f = sum(5, 3);
  941. f1 = razn(5, 3);
  942. printf("%d", ymn(f, f1));
  943. }
  944. int sum(int a, int b)
  945. {
  946. return a + b;
  947. }
  948. int razn(int a, int b)
  949. {
  950. return a - b;
  951. }
  952. int ymn(int (*f)(int, int), int (*f1)(int, int))// передаем функции сложения и вычитания входными параметрами в функцию умножения
  953. {
  954. int a = f;
  955. int b = f1;
  956. return a * b;
  957. }
  958. 27. Использование анонимного канала для передачи строковых значений между процессами
  959. Основной код программы:
  960. #define _CRT_SECURE_NO_WARNINGS
  961. #include <Windows.h>
  962. #include <stdio.h>
  963. int main()
  964. {
  965. HANDLE hReadPipe, hWritePipe;
  966. char message[] = "Hello, child process!";
  967. char buffer[256];
  968. SECURITY_ATTRIBUTES sa = { sizeof(sa),NULL,TRUE };
  969. DWORD bytesWritten, bytesRead;
  970. BOOL success;
  971. // Создаем анонимный канал
  972. success = CreatePipe(&hReadPipe, &hWritePipe, &sa, 256);
  973. if (!success)
  974. {
  975. printf("Error creating pipe\n");
  976. return 1;
  977. }
  978. // Создаем дочерний процесс
  979. STARTUPINFO si;
  980. ZeroMemory(&si, sizeof(si));
  981. si.cb = sizeof(si);
  982. si.hStdError = hWritePipe;
  983. si.hStdOutput = hWritePipe;
  984. si.dwFlags |= STARTF_USESTDHANDLES;
  985. PROCESS_INFORMATION pi;
  986. ZeroMemory(&pi, sizeof(pi));
  987. success = CreateProcessA(NULL, "..\\Debug\\Child.exe", NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
  988. if (!success)
  989. {
  990. printf("Error creating child process\n");
  991. return 1;
  992. }
  993. while (TRUE) {
  994. // Читаем из канала
  995. success = ReadFile(hReadPipe, buffer, sizeof(buffer), &bytesRead, NULL);
  996. if (!success)
  997. {
  998. printf("Error reading from pipe\n");
  999. return 1;
  1000. }
  1001. buffer[bytesRead] = '\0';
  1002. printf("Received message: %s\n", buffer);
  1003. }
  1004. }
  1005. Второй проект: создаем с названием Child, если другое, меняем путь
  1006. #define _CRT_SECURE_NO_WARNINGS
  1007. #include <Windows.h>
  1008. #include <stdio.h>
  1009. int main()
  1010. {
  1011. HANDLE hReadPipe = GetStdHandle(STD_OUTPUT_HANDLE);
  1012. while (TRUE)
  1013. {
  1014. char message[256];
  1015. DWORD bytesWritten;
  1016. scanf("%s", message);
  1017. WriteFile(hReadPipe, message, strlen(message), &bytesWritten, NULL);
  1018. }
  1019. return 0;
  1020. }