Падает Visual Studio 2008.
От: P.loo.t  
Дата: 17.12.10 08:54
Оценка:
У меня проблема, помогите разобраться или посоветуйте как лучше сделать. Цель написать прогу которая бы фиксировала открываемые и создаваемые окна в винде и записывала их в файлик. Проще говоря Мониторинг исполняемых файлов. Программа будет состоять из двух частей. Первый файл — запускаемый — будет загружать другой файл — динамическую библиотеку — в память. Так вот, в запускаемой проге (exe) мы будем загружать библиотеку и запускать ловушку. exe файлик создаём с помощью проета Win32. Листинг фрагмента кода (остальное нас не интересует):

// ...
    LONG      lResult;
    HINSTANCE hModule;
  
    // Создаем новый указатель на функцию
    typedef void (RunStopHookProc)(bool, HINSTANCE, HANDLE);
   
    RunStopHookProc* RunStopHook = 0;
   
    // Load the DLL file (Чтение DLL-библиотеки)
    hModule = ::LoadLibrary(L"VSysKey.dll");

    // Получить адрес функции в библиотеке
    RunStopHook = (RunStopHookProc*)::GetProcAddress(
            (HMODULE) hModule, "RunStopHook");

    // Выполнить функцию
    (*RunStopHook)(true, hInstance, hModule);

    // Цикл основного сообщения:
    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
// ...


В нём проблем нету и работает на ура и без ошибок. Вот код самого VSysKey.dll который мы описываем:

// FileMonitor.cpp : Defines the entry point for the DLL application.
//

#include <windows.h>
#include "stdafx.h"
#include "VSysKey.h"
#include "stdio.h"

HHOOK SysHook;
HINSTANCE hInst;

BOOL APIENTRY DllMaina( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    hInst=(HINSTANCE)hModule;
    return TRUE;
}

LRESULT CALLBACK SysMsgProc(

    int code,    // hook code
    WPARAM wParam,    // removal flag
    LPARAM lParam     // address of structure with message
   )
{
    //Передать сообщение другим ловушкам в системе
    CallNextHookEx(SysHook, code, wParam, lParam);

        // Код проверки удачного создания файлика Log.log в который по планам мы и должны будем всё записывать
    FILE *f=fopen("c:\\log.log","w");    
    fprintf(f,"hello");
    fclose(f);
        // Фрагмент окончен

    if (code == HCBT_ACTIVATE)
    {
        char windtext[255];
        HWND Wnd=((tagMSG*)lParam)->hwnd;
        GetWindowTextA(Wnd, windtext, 255);
        // Here you can save active window title
        // (Здесь можно сохранить заголовок активного окна)
        //MessageBoxA(0,windtext,windtext,0);
    }

    if (code == HCBT_CREATEWND)
    {
        char windtext[255];
        HWND Wnd=((tagMSG*)lParam)->hwnd;
        GetWindowTextA(Wnd, windtext, 255);        
        
        // Here you can save New file title
        // (Здесь можно сохранить заголовок нового окна)
    }
    //fclose(fuck);
    return 0;
}

///////////////////////////////////////////////////////////////////

DllExport void RunStopHook(bool State, HINSTANCE hInstance, HANDLE hModule)
{
    hInst=(HINSTANCE)hModule;
    if (true)
        SysHook = SetWindowsHookEx(WH_CBT, &SysMsgProc, hInst, 0);
    else
        UnhookWindowsHookEx(SysHook);
}


Без фрагмента с файлом (три строки создания файловой переменной, запись в файл и его закрытия) код работает на ура.

Теперь проблема:
1) Как только мы пытаемся создать файл и записать туда что-то, наша прога и библиотека компиляться без ошибок, только при запуске выскакивает Только мы жмём на кнопку ПРЕРВАТЬ — падаетвесь Visual Studio 2008. Просто вылетает прога. Что то может быть? Как этого можно избежать и добиться желаемой цели? Примечание: те же три строки если их прописать в exe файле работают на ура, создают и записывают в файл.
2) В фрагменте обработки события HCBT_ACTIVATE в коментарии есть строка MessageBoxA(0,windtext,windtext,0) где по идее windtext должна содержать заголовок активированного приложения. MessageBoxA работает, но выводит пустую строку... В чём проблема? Где я ошибся?
ПРИМЕЧАНИЕ: точка остановки при отладке не работает. Код выполняется не останавливаясь. В дебаге не могу посмотреть по шагово действия которые выполняет DLL и значения переменных. Опять же то уже третья проблема. Почему? В чём загвоздка?

P.S. У меня стоит Wondows 7 Home, до этого в течении полу года работал на Visual studio 2008 и не разу не сталкивался с подобными проблемами. Прошу не оставте без внимания...


20.12.10 17:27: Перенесено модератором из 'C/C++' — Odi$$ey
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.