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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.07.2013, 08:10   #1
Mr_ViK
Форумчанин
 
Регистрация: 12.08.2011
Сообщений: 124
Восклицание Поиск модуля в процессе или как бороться с _UNICODE

Всем привет, возникла такая проблема:
есть консольное приложение которое должно искать модуль в процессе:
(для отладки выводит все модули)

checkDll.h:
Код:
#pragma once
#ifndef _checkDll_H_
#define _checkDll_H_

#pragma warning (disable: 4800 4996)

bool SearchDll(const char * nameDll);

#endif
checkDll.cpp:
Код:
#include "checkDll.h"
#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>
#include <stdlib.h>
#include <stdio.h>
#include <locale.h>

#ifdef _UNICODE
#define _tsprintf swprintf
#define _tstrcmp _wcsicmp
#else
#define _tsprintf sprintf
#define _tstrcmp _stricmp
#endif

#ifdef _UNICODE
  wchar_t * a = new wchar_t;
  wchar_t * b = new wchar_t;
#else
  char * a = new char;
  char * b = new char;
#endif

BOOL _SearchProcessModule(const char* searchdll);

bool SearchDll(const char * nameDll) {

	if(_SearchProcessModule(nameDll)) return 1;
	
	return 0;
}

DWORD PIDByName(WCHAR * AProcessName)
{
	HANDLE pHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	PROCESSENTRY32 ProcessEntry;
	DWORD pid;
	ProcessEntry.dwSize = sizeof(ProcessEntry);
	bool Loop = Process32First(pHandle, &ProcessEntry);

	while (Loop)
	{
		if (wcsstr(ProcessEntry.szExeFile, AProcessName))
		{
			pid = ProcessEntry.th32ProcessID;
			CloseHandle(pHandle);
			return pid;
		}
		Loop = Process32Next(pHandle, &ProcessEntry);
	}
	CloseHandle(pHandle);
	return 0;
}

BOOL _SearchProcessModule(const char* searchdll)
{
  setlocale(LC_ALL,"");
  HANDLE snapshot = INVALID_HANDLE_VALUE;
  MODULEENTRY32 mod;
  DWORD dwPID = PIDByName(L"notepad++.exe");
  _tsprintf(a,TEXT("%s\n"),searchdll);
  

  snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);
  if(snapshot == INVALID_HANDLE_VALUE)
    return flase;
 
  mod.dwSize = sizeof(MODULEENTRY32);
  if( Module32First(snapshot, &mod) ) {

		_tsprintf(b,TEXT("%s\n"),mod.szModule);
		_tprintf(b);
		if (_tstrcmp(a,b)==0) return true;

        while( Module32Next(snapshot, &mod) ) {
			_tsprintf(b,TEXT("%s\n"),mod.szModule);
			_tprintf(b);
			if (_tstrcmp(a,b)==0) return true;
        }
        return false;
    }
    else {
        return false;
    }
 
	CloseHandle(snapshot);
	return false;
}
main.cpp:
Код:
#include <iostream>
#include "checkDll.h"

using std::cout;
using std::cin;

void main () {
	if(SearchDll("ntdll.dll")) cout<<"ntdll.dll exists in notepad.exe";
	cin.get();
}
выводит почему-то все модули, хотя по идее должен вывести все модули до ntdll.dll
после вывода при попытке закрыть консоль, падает с ошибкой (если надо ошибку заскриню) или просто не отвечает и закрывается

сам грешу на долбаный _UNICODE дефайн
подскажите в чем я ошибся?

ЗЫ: использую VS2010 Express

Последний раз редактировалось Mr_ViK; 02.07.2013 в 08:26.
Mr_ViK вне форума Ответить с цитированием
Старый 02.07.2013, 08:50   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от Mr_ViK Посмотреть сообщение
подскажите в чем я ошибся?
В Используйте LPCTSTR вместо const char* и _T("") макрос.
Либо поменяйте тип проекта на MultiByte вместо Unicode.
waleri вне форума Ответить с цитированием
Старый 02.07.2013, 09:28   #3
Mr_ViK
Форумчанин
 
Регистрация: 12.08.2011
Сообщений: 124
По умолчанию

А как можно конвертировать имя модуля (mod.szModule) в char*??
Mr_ViK вне форума Ответить с цитированием
Старый 02.07.2013, 10:29   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Либо поменят тип проекта на MultiByte либо воспользоваться WideCharToMultiByte()
waleri вне форума Ответить с цитированием
Старый 02.07.2013, 11:36   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

можно вполне спокойно вывести и wchar_t* в консоль.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 02.07.2013, 11:55   #6
Mr_ViK
Форумчанин
 
Регистрация: 12.08.2011
Сообщений: 124
По умолчанию

Всем спасибо, перевел все строки в обычный char[] и использовал WideCharToMultiByte()
Mr_ViK вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как бороться с информерами del piero Свободное общение 2 11.06.2012 12:24
Вирусы,бороться или переустанавливать программу. raiska Безопасность, Шифрование 8 31.03.2012 20:01
Информация о созданном процессе процессе Deathcore Помощь студентам 1 05.04.2011 19:54
Изменение PATH не влияет на поиск DLL в Vista в дочернем процессе GAAjr Win Api 6 07.02.2011 12:30
как бороться с табуляторами Fiesta200 Microsoft Office Word 11 08.10.2010 05:16