Змінюй хід війни! Допомагай ЗСУ!

Срочно нужна помощь в С+! На завтра

🔴 21:30 Повітряна тривога в Харків.обл.

Naprikovsky

Привіт!
Статус: Offline
Реєстрація: 06.10.2008
Повідом.: 8
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #1
Срочно нужна помощь в С++! На завтра

Написал программу которая работает с атомами через окно ребёнка, создаёт анонимный канал и работает с буфером обмена!

ПОМОГИТЕ!!! Прога работает нормально, только нагружает на 100% процессор(ядро) и выполняет действия только после нажатия клавиши alt
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #2
// WinTest.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "WinTest.h"
#include <stdio.h>

#define MAX_LOADSTRING 100

// Global Variables:
HINSTANCE hInst; // current instance
TCHAR szTitle[MAX_LOADSTRING]="Naprik № 4"; // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name
TCHAR buffer[150];
TCHAR Str_atom[MAX_LOADSTRING];

DWORD nPriorBas, nPriorThread,dwBaseAddr;
_CONTEXT context;
_LDT_ENTRY ldtEntry;

LPCTSTR lpszAppName = "MyApp";
LPCTSTR lpszTitle = "My Application";
HWND hWnd, hGlavn, hDopoln, hList1;
bool Sozd_ok=false;
//bool k=false;
ATOM Proverka;

// Forward declarations of functions included in this code module:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK Pered_Atom(HWND , UINT, WPARAM , LPARAM );

int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
MSG msg;
HACCEL hAccelTable;

// Initialize global strings
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_NAPRIK, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);

// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}

hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_NAPRIK);

// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}



ATOM MyRegisterClass(HINSTANCE hInstance)
{

WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_NAPRIK));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = CreateSolidBrush (RGB(129, 140, 255));;
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_NAPRIK);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

return RegisterClassEx(&wcex);
}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // Store instance handle in our global variable


hWnd=FindWindow(szWindowClass, "Naprik_2009");
hGlavn=hWnd;
if(!hWnd)
{
wsprintf(szTitle,"Naprik_2009");
}
else
{
hDopoln=hWnd;
Sozd_ok = true;
wsprintf(szTitle,"Naprik_Child");
}

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

if (!hWnd)
{
return FALSE;
}

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

return TRUE;
}

//VOID SetOwner( HWND hWnd )
//{
//TCHAR cName[64];
//TCHAR cTitle[128];
//HWND hCBOwner = GetClipboardOwner();

//if (hCBOwner == hWnd )
// strcpy( cName, "Local" );
//else
// strcpy( cName, "Another Application" );

//wsprintf( cTitle, "%s - [%s]", lpszAppName, cName );

//SetWindowText( hWnd, cTitle );
//}



LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
static char szWorkArea[100];
static HWND hNextViewer ;
RECT rClientRect;
//PAINTSTRUCT ps;
//HDC hdc;

switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;

case IDM_ADDATOM:
if(Sozd_ok)
{
if(!GlobalFindAtom(Str_atom))
{
DialogBox(hInst, (LPCTSTR)IDD_DIALOG1, hWnd, (DLGPROC)Pered_Atom);
Proverka=GlobalAddAtom(Str_atom);
if(Proverka==0)
{
MessageBox(hWnd, " Атом не записан ", " Ошибка ", MB_OK);
}
else
{
MessageBox(hWnd, " Атом записан ", " Сообщение ", MB_OK);
hList1=CreateWindowEx(WS_EX_CLIENTEDGE, "LISTBOX", "", LBS_STANDARD |
LBS_NOINTEGRALHEIGHT | WS_CHILD|WS_VISIBLE, 200, 100,400,700, hDopoln,
(HMENU)101, hInst, NULL );
SetForegroundWindow(hGlavn);
GlobalGetAtomName(Proverka, szWorkArea, 100 );
SendMessage(hList1, LB_INSERTSTRING, 0,(LPARAM)szWorkArea);
}
}
else
{
MessageBox(hWnd, " Атом уже имеется, чтобы записать удалите старый ", " Ошибка ", MB_OK);
}
}
else
{
MessageBox(hWnd, " Откройте зависимое окно ", " Ошибка ", MB_OK);
}
break;



case IDM_DELATOM:
if(Sozd_ok)
{
if(GlobalFindAtom(Str_atom)!=NULL)
{
GlobalDeleteAtom(Proverka);
DestroyWindow(hList1);
}
else
{
MessageBox(hWnd, " Атома с таким именем нет ", " Ошибка ", MB_OK);}
}
else
{
MessageBox(hWnd, " Откройте окно ребёнка ", " Ошибка ", MB_OK);
}
break;
case ID_ClearWind:
case ID_clear:
GetClientRect( hWnd, &rClientRect );
InvalidateRect(hWnd,&rClientRect,true);
break;

case ID_bufer:
{
PAINTSTRUCT ps; // Paint params from BeginPaint
HBITMAP hBitmap; // Handle to bitmap on clipboard
// Area to write in
HANDLE hMem; // Handle to text on clipboard

BeginPaint( hWnd, &ps );
GetClientRect( hWnd, &rClientRect );

// Open the clipboard.
//....................
OpenClipboard( hWnd );

// Try to get data as CF_TEXT format first.
//.........................................
if (hMem = GetClipboardData( CF_TEXT ))
{
LPSTR lpMem =(LPSTR) GlobalLock( hMem );
DrawText( ps.hdc, lpMem, -1, &rClientRect, DT_LEFT );
GlobalUnlock( hMem );
}
// If there is no text, try CF_BITMAP format.
//...........................................
else if (hBitmap = (HBITMAP)GetClipboardData( CF_BITMAP ))
{
BITMAP bm;
HDC hMemDC = CreateCompatibleDC( ps.hdc );

SelectObject( hMemDC, hBitmap );
GetObject( hBitmap, sizeof (BITMAP), (LPSTR) &bm );
BitBlt( ps.hdc, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY );

DeleteDC( hMemDC );
}

CloseClipboard( );
EndPaint( hWnd, &ps );
}
break;

case ID_AnonPipe:
{
if(Sozd_ok)
{
//if(!GlobalFindAtom(Str_atom))
//{
DialogBox(hInst, (LPCTSTR)IDD_DIALOG1, hWnd, (DLGPROC)Pered_Atom);
HANDLE hChildRead = NULL,hChildW = NULL;
DWORD dwWritten = 0,dwRead =0;
if(CreatePipe(&hChildRead,&hChildW,0,0))
{
if(WriteFile(hChildW,Str_atom,strlen(Str_atom)+1,&dwWritten,0))
{
MessageBox(hWnd,"записано","",0);
hList1=CreateWindowEx(WS_EX_CLIENTEDGE, "LISTBOX", "", LBS_STANDARD |
LBS_NOINTEGRALHEIGHT | WS_CHILD|WS_VISIBLE, 0, 0,200,100, hDopoln,
(HMENU)101, hInst, NULL );

if(ReadFile(hChildRead,szWorkArea,sizeof(szWorkArea),&dwRead,0))
{
SendMessage(hList1, LB_INSERTSTRING, 0,(LPARAM)szWorkArea);
}
}
else MessageBox(hWnd,"ошибка записи","",0);
}
else MessageBox(hWnd,"Канал не создан","",0);
//}
//else
//{
// MessageBox(hWnd, " Атом уже записан, чтобы записать удалите старый ", " Ошибка ", MB_OK);
//}
}
else
{
MessageBox(hWnd, " Откройте окно ребёнка ", " Ошибка ", MB_OK);
}

}
break;

case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;

case WM_DESTROY:
PostQuitMessage(0);
break;

case WM_PAINT:

break;

/*case WM_CREATE:
hNextViewer = SetClipboardViewer( hWnd );
SetOwner( hWnd );
break;*/
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

// Message handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;

case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;

}

//////////Передача с помощью таблицы атомов//////////
LRESULT CALLBACK Pered_Atom(HWND hDlg2, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDCANCEL:
//GetDlgItemText(hDlg2,(int)" ",(LPSTR)Str_atom,sizeof(Str_atom)-1);
EndDialog(hDlg2, LOWORD(wParam));
break;
case IDOK:
GetDlgItemText(hDlg2,IDC_EDIT1,(LPSTR)Str_atom,sizeof(Str_atom)-1);
EndDialog(hDlg2, LOWORD(wParam));
break;
}
default:
return FALSE;
}
return TRUE;
}
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #3
Вот сам салюшен
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #4
трансформируйте ваши токены для валидного парсинга :)
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #5
Проблема видна сразу же :)
Убери нахуй WM_PAINT из case обработки сообщений. Ты его должен либо правильно обрабатывать, либо отдавать DefWindowProc. Игнорировать - НЕЛЬЗЯ.
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #6
sergeime, +1:)
PS: ТС, также убей нах вызов LoadAccelerators если хочешь, чтобы все работало без нажатия на клавишу Alt (и вообще, акселераторы тебе здесь не нужны).

ЗЫЗЫ Если ТС уж очень не доверяет дефолтному обработчику, то пусть слепит примерно такой код:
Код:
case WM_PAINT:
    PAINTSTRUCT psNaprik;
    HDC hdcNaprik=BeginPaint(hGlavn,&psNaprik);
    EndPaint(hGlavn,&psNaprik);
break;
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #7
sergeime, +1:)
PS: ТС, также убей нах вызов LoadAcceleratorsTable если хочешь, чтобы все работало без нажатия на клавишу Alt (и вообще, акселераторы тебе здесь не нужны).

LoadAcceleratorsTable здесь вобщее не при чем, у него их просто нет, там handle - NULL. Проблема с альтом была из-за WM_PAINT.
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #8
sergeime, +1:)
PS: ТС, также убей нах вызов LoadAccelerators если хочешь, чтобы все работало без нажатия на клавишу Alt (и вообще, акселераторы тебе здесь не нужны).

ЗЫЗЫ Если ТС уж очень не доверяет дефолтному обработчику, то пусть слепит примерно такой код:
Код:
case WM_PAINT:
    PAINTSTRUCT psNaprik;
    HDC hdcNaprik=BeginPaint(hGlavn,&psNaprik);
    EndPaint(hGlavn,&psNaprik);
break;

Наблюдательность тут не при чем - опыт мать его. Кто читал Петзольда еще в редакции для Win16 - тот понял жизнь :)
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #9
Та ладно, и не такое читали!:D Просто глюки могут быть в разных местах, но к перерисовке содержимого окна конечно надо относится с особенным вниманием.
ЗЫ: Новички, все слышали?:ги:
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #10
Та ладно, и не такое читали!:D Просто глюки могут быть в разных местах, но к перерисовке содержимого окна конечно надо относится с особенным вниманием.
ЗЫ: Новички, все слышали?:ги:

Новички уже не те... щас на Win API разве что лабу могут заставить делать, как ТС :)
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #11
LoadAcceleratorsTable здесь вобщее не при чем, у него их просто нет, там handle - NULL. Проблема с альтом была из-за WM_PAINT.
hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_NAPRIK); - судя по всему, все-таки загружает ресурс таблицы...
Кстати, ТС, правильнее будет все-таки так: LoadAccelerators(hInstance, (LPTSTR)(DWORD)IDC_NAPRIK); бо иначе у вас WORD разворачивается в указатель на строку-константу, а при разных настройках среды LPCTSTR и LPTSTR могут быть не одно и то же.
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #13
А, ну я поняла. Я просто его архивы не качнула, думала, что оно там где-то есть в rc. Теперь понятно.
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #15
Кстати, ТС, правильнее будет все-таки так: LoadAccelerators(hInstance, (LPTSTR)(DWORD)IDC_NAPRIK); бо иначе у вас WORD разворачивается в указатель на строку-константу, а при разных настройках среды LPCTSTR и LPTSTR могут быть не одно и то же.

При чем здесь настройки среды с разворачиванию typedef? LPTSTR запросто кастится в LPCTSTR, наоборот уже надо const_cast юзать.
Вот если бы буквы Т после LP не было - тогда я бы мог согласиться.

Ваще-то если уж совсем правильно то надо MAKEINTRESOURCE использовать.
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #16
А это и есть тело макроса MAKEINTRESOURCE
 
Назад
Зверху Знизу