Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.07.2011, 03:07   #1
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию Windows 7/x32 Crash

Доброго времени суток уважаемые гении. Столкнулся сегодня с аномалиями и даже не могу понять в чем дело, поэтому решил спросить, может у кого бывало такое. Вообщем использую глобальные хуки средствами *.dll в своем приложение *.exe и проблема только на Os = TopicName; То есть, если я запускаю мое приложение *.exe оно тупо вылетает при попытке использования моего события с мышкой или клавой, например прокрутки колесика/ на других осях все работает.
Но самое странное в этом то, что я написал дополнительную программу, маленькую, которая просто запускает мое приложение *.exe и все работает к удивлению, как это так?


Код:
#include <windows.h>
#include <stdio.h>
#include <string.h>

const int MAXLEN = 255;

int main(void)
{ 
 char lpBuffer[MAXLEN];
 GetCurrentDirectory(sizeof(lpBuffer), lpBuffer);
 strcat(lpBuffer, "\\main.exe");
 WinExec(lpBuffer, SW_SHOWNORMAL);
 return 0;
}
My3dCam.h
Код hook'а, не анализируйте, просто взглядом пройдитесь. Привел код для того чтобы вы посмотрели что ничего специфического нету, стандартный хук и свои некие действия.

Код:
#pragma once

static HINSTANCE hInstance;

namespace System
{
 class CMy3D 
 {
  public:
   CMy3D::CMy3D(void) {};
   CMy3D::~CMy3D() {};

   void Hook();
   void UnHook();

  private:
   static void CAMDefault(void *lParam);
   static LRESULT CALLBACK MouseProc(int, WPARAM, LPARAM);
   static LRESULT CALLBACK KeyboardProc(int, WPARAM, LPARAM);
   BOOL MouseSetHook(BOOL);
   BOOL KeyboardSetHook(BOOL);
 };
} 
extern System::CMy3D My3D;

Последний раз редактировалось coNsept; 10.07.2011 в 03:37.
coNsept вне форума Ответить с цитированием
Старый 10.07.2011, 03:08   #2
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

My3dCam.сpp

Код:
#include "stdafx.h"
#include "My3D.h"

#pragma data_seg(".SHAREDDATA")
static HHOOK MouseHook = NULL; static HHOOK KeyboardHook = NULL;
#pragma data_seg()
#pragma comment(linker, "/SECTION:.SHAREDDATA,RWS")

struct CAMDefault
{
 float Zoom;
 float RotY;
 float RotZ;
 float PosZ;
 float ClipX;
 float ClipY;
 float GlClip;
} Camera;

float *Camera_Zoom   = (float*) 0x006001E9;
float *Camera_RotY   = (float*) 0x0088BC78;
float *Camera_RotZ   = (float*) 0x0809F150;
float *Camera_PosZ   = (float*) 0x0088ACFC;
float *Camera_ClipX  = (float*) 0x0088BB18;
float *Camera_ClipY  = (float*) 0x005AB4CD;
float *Camera_GlClip = (float*) 0x0088BB4C;

int *CMAP_CHECK  = (int*)0x008C5CF8; 
int *CMAIN_STATE = (int*)0x008D6F7C;

bool CAM_Init = true;
bool CAM_Move = false;
bool VK_IsPressed = false;

int MouseX, MouseY;

#define CAM_DEFAULT (*Camera_PosZ != 150.0f || *Camera_RotZ != -45.0f || *Camera_RotY != -48.5f || *Camera_Zoom != 35.0f)

System::CMy3D My3D;

bool Is3D = GetPrivateProfileIntA("3D", "IsEnabled", true, "./Custom/Settings.ini");
bool CAM_IsActive = GetPrivateProfileIntA("3D", "IsActive", true, "./Custom/Settings.ini");
int Sensivity = GetPrivateProfileIntA("3D", "Sensivity", 8, "./Custom/Settings.ini");

Последний раз редактировалось coNsept; 10.07.2011 в 03:25.
coNsept вне форума Ответить с цитированием
Старый 10.07.2011, 03:21   #3
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Код:
void System::CMy3D::Hook()
{
 if (Is3D) {
  this->MouseSetHook(true);
  this->KeyboardSetHook(true);
 }
};

void System::CMy3D::UnHook()
{
 if (Is3D) {
  this->MouseSetHook(false);
  this->KeyboardSetHook(false);
 }
};

void System::CMy3D::CAMDefault(void *lParam)
{
 while (CAM_DEFAULT)
 {
  (*Camera_PosZ > 150.0f) ? *Camera_PosZ -= 5.0f : *Camera_PosZ += 5.0f;
  if (*Camera_PosZ > 146.0f && *Camera_PosZ < 152.0f)
   *Camera_PosZ = 150.0f;
  (*Camera_RotZ > -45.0f) ? *Camera_RotZ -= 1.0f : *Camera_RotZ += 1.0f;
  if (*Camera_RotZ > -47.0f && *Camera_RotZ < -43.0f)
   *Camera_RotZ = -45.0f;
  (*Camera_RotY > -48.5f) ? *Camera_RotY -= 0.5f : *Camera_RotY += 0.5f;
  if (*Camera_RotY > -50.5f && *Camera_RotY < -46.5f)
   *Camera_RotY = -48.5f; 
  (*Camera_Zoom > 35.0f) ? *Camera_Zoom -= 1.0f : *Camera_Zoom += 1.0f;
  if (*Camera_Zoom > 33.0f && *Camera_Zoom < 37.0f)
   *Camera_Zoom = 35.0f;
  Sleep(2);
 }
_endthread();
};

BOOL System::CMy3D::KeyboardSetHook(BOOL set_or_remove)
{
 if (set_or_remove == TRUE)
 {
  if (KeyboardHook == NULL)
  {
    KeyboardHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, hInstance, GetCurrentThreadId());
    if(!KeyboardHook) { return FALSE; }
  }
 } 
 else {
  return UnhookWindowsHookEx(KeyboardHook);
  KeyboardHook = NULL;
 }
 return TRUE;
};

BOOL System::CMy3D::MouseSetHook(BOOL set_or_remove)
{
 if (set_or_remove == TRUE)
 {
  if (MouseHook == NULL)
  {
   MouseHook = SetWindowsHookEx(WH_MOUSE, MouseProc, hInstance, GetCurrentThreadId());
   if(!MouseHook) { return FALSE; }
  }
 } 
 else {
  return UnhookWindowsHookEx(MouseHook); 
  MouseHook = NULL;
 }
 return TRUE;
};

LRESULT CALLBACK System::CMy3D::KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{	
 if (((lParam >> 31) & 1) && (nCode == HC_ACTION))
 {
  if (wParam == VK_F9)
  {
   if (VK_IsPressed == false && CAM_IsActive == true)
   {
    VK_IsPressed = true; CAM_IsActive = false;
   }
   else {
    VK_IsPressed = false; CAM_IsActive = true;
   }
  }

  if (wParam == VK_F10) {
   _beginthread(My3D.CAMDefault, 0, NULL); 
  }
 }	
 return CallNextHookEx(KeyboardHook, nCode, wParam, lParam);
};

LRESULT CALLBACK System::CMy3D::MouseProc(int code, WPARAM wParam, LPARAM lParam)
{
 MOUSEHOOKSTRUCTEX* mhs = (MOUSEHOOKSTRUCTEX*)lParam;
 HWND MuWnd = FindWindow("MU", NULL);

 if (*CMAIN_STATE == 0x4 || *CMAP_CHECK == 0x1E || *CMAP_CHECK == 0x3E) {
  CAM_Init = false;
  *Camera_ClipX  = Camera.ClipX; 
  *Camera_ClipY  = Camera.ClipY; 
  *Camera_GlClip = Camera.GlClip;
  *Camera_PosZ   = 150.0f; 
  *Camera_RotY   = -48.5f; 
  *Camera_RotZ   = -45.0f; 
  *Camera_Zoom   = 35.0f;	
 }
 
 if (CAM_IsActive) {
  if (GetForegroundWindow() == MuWnd) {
   if (CAM_Init)
   {
    Camera.ClipX = *Camera_ClipX;
    Camera.ClipY = *Camera_ClipY;
    Camera.GlClip = *Camera_GlClip;
    Camera.PosZ = *Camera_PosZ;
    Camera.RotY = *Camera_RotY;
    Camera.RotZ = *Camera_RotZ;
    Camera.Zoom = *Camera_Zoom;
    CAM_Init = false;
   }
   if (wParam == WM_MOUSEWHEEL) {
    int direction = mhs->mouseData;
    if (direction > 0) {
     if (*Camera_Zoom < 60) { 
      *Camera_Zoom += 2;
     }
    }
    else if (direction < 0) {
    if (*Camera_Zoom > 12) { 
     *Camera_Zoom -= 2; 
    }
   } 
   *Camera_ClipX  = 1190 + (abs(*Camera_PosZ - 150) * 3) + 3000;
   *Camera_ClipY  = 2400 + (abs(*Camera_PosZ - 150) * 3) + 3000;
   *Camera_GlClip = 3000 + (abs(*Camera_PosZ - 150) * 3) + 1500;
   }
   else if (wParam == WM_MBUTTONDOWN) {
    MouseX = mhs->pt.x;
    MouseY = mhs->pt.y;
    CAM_Move = true;
  }
  else if (wParam == WM_MBUTTONUP) {
   CAM_Move = false;
  } 
  else if (wParam == WM_MOUSEMOVE) {
   if (CAM_Move) {
    if (MouseX < mhs->pt.x) {
     *Camera_RotZ += Sensivity;
     if (*Camera_RotZ > 315) 
      *Camera_RotZ = -45;
    }
    else if (MouseX > mhs->pt.x) {
     *Camera_RotZ -= Sensivity;
     if (*Camera_RotZ < -405) 
     *Camera_RotZ = -45;
    }
    if (MouseY < mhs->pt.y) {
     if (*Camera_RotY < -45) {
      *Camera_PosZ -= 44;
       *Camera_RotY += (float)2.42;
     }
    }
    else if (MouseY > mhs->pt.y)
    {
     if (*Camera_RotY > -90) {
      *Camera_PosZ += 44;
      *Camera_RotY -= (float)2.42;
     }
    }
    MouseX = mhs->pt.x;
    MouseY = mhs->pt.y;

    *Camera_ClipX  = 1190 + (abs(*Camera_PosZ - 150) * 3) + 3000;
    *Camera_ClipY  = 2400 + (abs(*Camera_PosZ - 150) * 3) + 3000;
    *Camera_GlClip = 3000 + (abs(*Camera_PosZ - 150) * 3) + 1500;
   }
  }
 }
 }
 return CallNextHookEx(MouseHook, code, wParam, lParam);
};

Последний раз редактировалось coNsept; 10.07.2011 в 03:25.
coNsept вне форума Ответить с цитированием
Старый 10.07.2011, 04:08   #4
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

else {
return UnhookWindowsHookEx(MouseHook);
MouseHook = NULL;
}
Переменные MouseHook, KeyboardHook никогда не обнуляются.
А так как они объявлены в шаровой секции, то достаточно одного процесса (даже не твоего) держащего dll загруженной, чтобы последующие попытки установки хука
вели.. ну сам знаешь.
Я вот так вижу.
EUGY вне форума Ответить с цитированием
Старый 10.07.2011, 10:28   #5
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

EUGY, можешь кинуть в л.с. свои контактные данные: icq, skype, msn либо что-то еще?

Последний раз редактировалось coNsept; 10.07.2011 в 10:32.
coNsept вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Правда ли что Windows xp 64 определяет болше Оперативки чем Windows xp 32 subbota Операционные системы общие вопросы 4 03.06.2012 17:29
Автозагрузка, каталог "Автозагрузка" создается повторно (Win7 x32) MyIE Общие вопросы Delphi 10 29.03.2012 07:49
Microsoft Incremental Linker Crash Ivan_32 Общие вопросы C/C++ 2 03.07.2011 18:37
CRASH-FAW Cheat EXE not info YRASOV Общие вопросы Delphi 2 24.08.2010 11:57
Windows7,не работает HKEY_LOCAL_MACHINE\SOFTWARE\Microso ft\Windows NT\CurrentVersion\Windows\AppInit_D LLs ассемблер123 Windows 0 22.04.2010 18:30