У меня проблема, помогите разобраться или посоветуйте как лучше сделать. Цель написать прогу которая бы фиксировала открываемые и создаваемые окна в винде и записывала их в файлик. Проще говоря Мониторинг исполняемых файлов. Программа будет состоять из двух частей. Первый файл — запускаемый — будет загружать другой файл — динамическую библиотеку — в память. Так вот, в запускаемой проге (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