Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
 Аватар для Faraon
26 / 25 / 9
Регистрация: 17.09.2011
Сообщений: 143

Получение MD5 запущенных процессов

17.01.2014, 12:44. Показов 1953. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток!
помогите разобраться что не так я сделал вот код
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void FileNameCP()
{
 
CHAR module[MAX_PATH];
TCHAR szProcessName1[MAX_PATH];
HANDLE    hProcess;
DWORD        aProcesses[1024]; 
DWORD        cbNeeded; 
DWORD        cProcesses;
HMODULE    hMod;
EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded);
cProcesses = cbNeeded / sizeof(DWORD);
MD5 md5 ;
for (int i = 0; i < cProcesses; i++ )
{        
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, aProcesses[i]);
    if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) )
    {
        GetModuleBaseNameW( hProcess, hMod,szProcessName1 , sizeof(szProcessName1));
        //MessageBox(NULL,szProcessName1,TEXT("Info"),MB_OK);
        GetModuleFileNameEx( hProcess, hMod,(LPWSTR)module, sizeof(module));
        
        
            std::string  hashmd5 = md5.digestFile (module);
     
        MessageBox(NULL,(LPWSTR) module,TEXT("Info"),MB_OK);
 
         MessageBoxA(NULL,md5.digestFile (module), "Info",MB_OK);
        /* .... */
    }
    CloseHandle( hProcess );
}
}
не выдает мд5 процесов
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.01.2014, 12:44
Ответы с готовыми решениями:

Вывести список запущенных процессов
Нужно вывести список запущенных процессов, задание вроде не сложное, но его нужно сделать не в консоле, а в окне. Кто сможет помочь, и...

Получение времени создания процессов
Имеется данная функция, которая пробегается по всем процессам, необходимо узнать время создания каждого процесса, но в итоге получается,...

Программа,выводящая список запущенных процессов в порядке присвоенного им ID (по убыванию)
Нужна программа с++, выводящая список запущенных процессов в порядке присвоенного им ID (по убыванию)

15
 Аватар для Faraon
26 / 25 / 9
Регистрация: 17.09.2011
Сообщений: 143
21.01.2014, 11:00  [ТС]
наверно не так выразился раз не кто не отвечает!!
в общем получил путь процессов
C
1
GetModuleFileNameEx( hProcess, hMod,(LPWSTR)module, sizeof(module));
в меседжбок выводит к примеру так c:\fff\proc.exe я думаю из за слэшей у меня не получается определить мд5 или чтото не так с перемеными
как сделать чтобы в
C
1
std::string  hashmd5 = md5.digestFile (module);
был путь c:/fff/proc.exe это в module
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
21.01.2014, 12:05
напрямик вот так пробовали?
C++
1
std::string  hashmd5 = md5.digestFile ("c:\\fff\\proc.exe ");
выдаст хэш?
0
 Аватар для Faraon
26 / 25 / 9
Регистрация: 17.09.2011
Сообщений: 143
21.01.2014, 12:31  [ТС]
да выдает
но мне надо чтобы путь брался из (module) а если ставлю (module) то выдает типо мммммммммммммммммммммммммммммммммммммммм мм вот такого фармата
хотя вывожу в мсбокс
C
1
MessageBox(NULL,(LPWSTR) module,TEXT("Info"),MB_OK);
все норм каждый процесс пишет путь кнему
но вывожу мд5 не получается
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
21.01.2014, 12:34
Цитата Сообщение от Faraon Посмотреть сообщение
CHAR module[MAX_PATH];
...
GetModuleFileNameEx( hProcess, hMod,(LPWSTR)module, sizeof(module));
Здесь module - массив CHAR-ов (1 байт на символ), а GetModuleFileNameEx юникодная,
ей требуется буфер WCHAR-ов.
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
21.01.2014, 12:43
предварительно дублируйте слеши в module
или вообще удаляйте, для хэша это несущественно

Добавлено через 7 минут
...хотя вообще-то опасно, лучше заменять на другой символ.
но по ходу все-таки дело в юникоде как сказал Убежденный.
в ShowMessage удалось отобразить т.к. опять же привел тип, а вот в хэш уже лезет не байт-символ как надо
0
 Аватар для Faraon
26 / 25 / 9
Регистрация: 17.09.2011
Сообщений: 143
21.01.2014, 13:15  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Здесь module - массив CHAR-ов (1 байт на символ), а GetModuleFileNameEx юникодная,
ей требуется буфер WCHAR-ов.
а можно пример ,я новичок в с++ еще несильно в нем понимаю

Добавлено через 17 минут
просто непонятно я вывожу пути процессов
C
1
  MessageBox(NULL,(LPWSTR) module,TEXT("Info"),MB_OK);
все норм выдает мне их только с там слэш надо поменять будет , но если в
C
1
std::string  hashmd5 = md5.digestFile (module)
; пробую засунуть вот так чтобы поменять слэш и путь получить норм
C
1
2
3
4
5
6
7
8
    string ss = ((LPCSTR)module);
         
      ss.replace( ss.begin(), ss.end(), '\\', '\\\\'); // replace all 'x' to 'y'
            string hashmd5 = md5.digestFile ((LPSTR)module);
 
     MessageBoxA(NULL,md5.digestFile ((LPSTR)module), "Info",MB_OK);
 
     MessageBox(NULL,(LPWSTR) module,TEXT("Info"),MB_OK);
также выдает ммммммммммммммммммммммммммммммммммммм на каждый процесс

Добавлено через 2 минуты
если нужен MD5 md5; вот
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
#ifndef MD5_H
#define MD5_H
#include <stdio.h>
 
#include <string.h>
 
#pragma region MD5 defines
#define S11 7
#define S12 12
#define S13 17
#define S14 22
#define S21 5
#define S22 9
#define S23 14
#define S24 20
#define S31 4
#define S32 11
#define S33 16
#define S34 23
#define S41 6
#define S42 10
#define S43 15
#define S44 21
static unsigned char PADDING[64] = {
  0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
// F, G, H and I are basic MD5 functions.
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
#define H(x, y, z) ((x) ^ (y) ^ (z))
#define I(x, y, z) ((y) ^ ((x) | (~z)))
// ROTATE_LEFT rotates x left n bits.
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
// FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
// Rotation is separate from addition to prevent recomputation.
#define FF(a, b, c, d, x, s, ac) { \
  (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
  (a) = ROTATE_LEFT ((a), (s)); \
  (a) += (b); \
  }
#define GG(a, b, c, d, x, s, ac) { \
  (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
  (a) = ROTATE_LEFT ((a), (s)); \
  (a) += (b); \
  }
#define HH(a, b, c, d, x, s, ac) { \
  (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
  (a) = ROTATE_LEFT ((a), (s)); \
  (a) += (b); \
  }
#define II(a, b, c, d, x, s, ac) { \
  (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
  (a) = ROTATE_LEFT ((a), (s)); \
  (a) += (b); \
  }
#pragma endregion
 
typedef unsigned char BYTE ;
 
// POINTER defines a generic pointer type
typedef unsigned char *POINTER;
 
// UINT2 defines a two byte word
typedef unsigned short int UINT2;
 
// UINT4 defines a four byte word
typedef unsigned long int UINT4;
 
 
// convenient object that wraps
// the C-functions for use in C++ only
class MD5
{
private:
  struct __context_t {
    UINT4 state[4];                                   /* state (ABCD) */
    UINT4 count[2];        /* number of bits, modulo 2^64 (lsb first) */
    unsigned char buffer[64];                         /* input buffer */
  } context ;
 
  #pragma region static helper functions
  // The core of the MD5 algorithm is here.
  // MD5 basic transformation. Transforms state based on block.
  static void MD5Transform( UINT4 state[4], unsigned char block[64] )
  {
    UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
 
    Decode (x, block, 64);
 
    /* Round 1 */
    FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
    FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
    FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
    FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
    FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
    FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
    FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
    FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
    FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
    FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
    FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
    FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
    FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
    FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
    FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
    FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
 
    /* Round 2 */
    GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
    GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
    GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
    GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
    GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
    GG (d, a, b, c, x[10], S22,  0x2441453); /* 22 */
    GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
    GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
    GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
    GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
    GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
    GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
    GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
    GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
    GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
    GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
 
    /* Round 3 */
    HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
    HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
    HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
    HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
    HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
    HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
    HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
    HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
    HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
    HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
    HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
    HH (b, c, d, a, x[ 6], S34,  0x4881d05); /* 44 */
    HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
    HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
    HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
    HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
 
    /* Round 4 */
    II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
    II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
    II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
    II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
    II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
    II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
    II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
    II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
    II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
    II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
    II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
    II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
    II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
    II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
    II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
    II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
 
    state[0] += a;
    state[1] += b;
    state[2] += c;
    state[3] += d;
 
    // Zeroize sensitive information.
    memset((POINTER)x, 0, sizeof (x));
  }
    // Encodes input (UINT4) into output (unsigned char). Assumes len is
  // a multiple of 4.
  static void Encode( unsigned char *output, UINT4 *input, unsigned int len )
  {
    unsigned int i, j;
 
    for (i = 0, j = 0; j < len; i++, j += 4) {
      output[j] = (unsigned char)(input[i] & 0xff);
      output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
      output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
      output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
    }
  }
 
  // Decodes input (unsigned char) into output (UINT4). Assumes len is
  // a multiple of 4.
  static void Decode( UINT4 *output, unsigned char *input, unsigned int len )
  {
    unsigned int i, j;
 
    for (i = 0, j = 0; j < len; i++, j += 4)
      output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) |
      (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24);
  }
  #pragma endregion
 
 
public:
  // MAIN FUNCTIONS
  MD5()
  {
    Init() ;
  }
    // MD5 initialization. Begins an MD5 operation, writing a new context.
  void Init()
  {
    context.count[0] = context.count[1] = 0;
  
    // Load magic initialization constants.
    context.state[0] = 0x67452301;
    context.state[1] = 0xefcdab89;
    context.state[2] = 0x98badcfe;
    context.state[3] = 0x10325476;
  }
 
  // MD5 block update operation. Continues an MD5 message-digest
  // operation, processing another message block, and updating the
  // context.
  void Update(
    unsigned char *input,   // input block
    unsigned int inputLen ) // length of input block
  {
    unsigned int i, index, partLen;
 
    // Compute number of bytes mod 64
    index = (unsigned int)((context.count[0] >> 3) & 0x3F);
 
    // Update number of bits
    if ((context.count[0] += ((UINT4)inputLen << 3))
      < ((UINT4)inputLen << 3))
      context.count[1]++;
    context.count[1] += ((UINT4)inputLen >> 29);
 
    partLen = 64 - index;
 
    // Transform as many times as possible.
    if (inputLen >= partLen) {
      memcpy((POINTER)&context.buffer[index], (POINTER)input, partLen);
      MD5Transform (context.state, context.buffer);
 
      for (i = partLen; i + 63 < inputLen; i += 64)
        MD5Transform (context.state, &input[i]);
 
      index = 0;
    }
    else
      i = 0;
 
    /* Buffer remaining input */
    memcpy((POINTER)&context.buffer[index], (POINTER)&input[i], inputLen-i);
  }
 
  // MD5 finalization. Ends an MD5 message-digest operation, writing the
  // the message digest and zeroizing the context.
  // Writes to digestRaw
  void Final()
  {
    unsigned char bits[8];
    unsigned int index, padLen;
 
    // Save number of bits
    Encode( bits, context.count, 8 );
 
    // Pad out to 56 mod 64.
    index = (unsigned int)((context.count[0] >> 3) & 0x3f);
    padLen = (index < 56) ? (56 - index) : (120 - index);
    Update( PADDING, padLen );
 
    // Append length (before padding)
    Update( bits, 8 );
 
    // Store state in digest
    Encode( digestRaw, context.state, 16);
 
    // Zeroize sensitive information.
    memset((POINTER)&context, 0, sizeof (context));
 
    writeToString() ;
  }
 
  /// Buffer must be 32+1 (nul) = 33 chars long at least 
  void writeToString()
  {
    int pos ;
 
    for( pos = 0 ; pos < 16 ; pos++ )
      sprintf( digestChars+(pos*2), "%02x", digestRaw[pos] ) ;
  }
 
 
public:
  // an MD5 digest is a 16-byte number (32 hex digits)
  BYTE digestRaw[ 16 ] ;
 
  // This version of the digest is actually
  // a "printf'd" version of the digest.
  char digestChars[ 33 ] ;
 
  /// Load a file from disk and digest it
  // Digests a file and returns the result.
  char* digestFile( char *filename )
  {
    Init() ;
 
    FILE *file;
    
    int len;
    unsigned char buffer[1024] ;
 
    if( (file = fopen (filename, "rb")) == NULL )
      printf( "%s can't be opened\n", filename ) ;
    else
    {
      while( len = fread( buffer, 1, 1024, file ) )
        Update( buffer, len ) ;
      Final();
 
      fclose( file );
    }
 
    return digestChars ;
  }
 
  /// Digests a byte-array already in memory
  char* digestMemory( BYTE *memchunk, int len )
  {
    Init() ;
    Update( memchunk, len ) ;
    Final() ;
    
    return digestChars ;
  }
 
  // Digests a string and prints the result.
  char* digestString( char *string )
  {
    Init() ;
    Update( (unsigned char*)string, strlen(string) ) ;
    Final() ;
 
    return digestChars ;
  }
} ;
 
#endif
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
21.01.2014, 13:22
Цитата Сообщение от Faraon Посмотреть сообщение
а можно пример ,я новичок в с++ еще несильно в нем понимаю
Вы пытаетесь делать примерно следующее:
C++
1
2
char pText[] = {"Hello!"};
MessageBoxW(NULL, (LPCWSTR)pText, L"Message", MB_OK);
Это не будет работать.
pText в данном случае - это массив char-ов, т.е. по одному байту на символ.
А MessageBoxW ожидает wchar_t-строку (2 байта на символ в общем случае).
Поэтому вместо "Hello" здесь будет выведено нечто другое.

Выхода два - либо везде использовать TCHAR (вместо char или wchar_t), а имена функций и
структур писать нейтральные к типу символа (MessageBox вместо MessageBoxA или MessageBoxW,
WNDCLASSEX вместо WNDCLASSEXA или WNDCLASSEXW и т.д.), либо наоборот - всегда точно
указывать тип символа и соответствующие варианты функций - char/MessageBoxA/WNDCLASSEXA или
wchar_t/MessageBoxW/WNDCLASSEXW.

А вот такие вот приведения типа:
C++
1
MessageBox(NULL,(LPWSTR) module,TEXT("Info"),MB_OK);
Ни в коем случае делать нельзя. Допустим, MessageBox в данном случае юникодная (работает с
wchar_t), а module - массив char-ов. Вместо того, чтобы или конвертировать массив module в
юникодный формат, или использовать MessageBoxA явным образом, Вы просто "обманываете"
функцию, заставляя ее "поверить", что в module лежат юникодные символы. Хотя там char-ы...
1
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
21.01.2014, 13:30
Цитата Сообщение от Убежденный Посмотреть сообщение
Ни в коем случае делать нельзя
ну почему же нельзя? можно, если понимаешь что делаешь, даже несмотря на то, что это некорректно.
тут если бы digestFile работал с юникодом все проканало бы, так же через приведение.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
21.01.2014, 13:36
Цитата Сообщение от AntonChik Посмотреть сообщение
тут если бы digestFile работал с юникодом все проканало бы, так же через приведение.
Нет, ничего бы не вышло. Посмотрите на объявление module:
C++
1
CHAR module[MAX_PATH];
Как не приводи к юникоду, текст в module все равно останется в CHAR-ах.
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
21.01.2014, 13:41
не совсем так.
функция
C++
1
GetModuleFileNameEx( hProcess, hMod,(LPWSTR)module, sizeof(module));
обманом, как вы говорите, запишет в массив module юникодовский текст
т.е. после этого с module никак нельзя работать как с char (без какого-то обратного колдовства)
поэтому нормально отрабатывает опять через обман функция
C++
1
MessageBox(NULL,(LPWSTR) module,TEXT("Info"),MB_OK);
и проканала бы точно так же
C++
1
std::string  hashmd5 = md5.digestFile ((LPWSTR) module);
поддерживай она юникод
0
 Аватар для Faraon
26 / 25 / 9
Регистрация: 17.09.2011
Сообщений: 143
21.01.2014, 13:54  [ТС]
C++
1
std::string  hashmd5 = md5.digestFile ((LPWSTR) module);
не , пишет Аргумент типа LPWSTR не совместим с параметрами типа char**
скорее всего md5.digestFile требует чтобы было char
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
21.01.2014, 14:03
Цитата Сообщение от AntonChik Посмотреть сообщение
можно, если понимаешь что делаешь, даже несмотря на то, что это некорректно.
Согласен.
Но топикстартеру такое сейчас лучше не советовать.
0
 Аватар для Faraon
26 / 25 / 9
Регистрация: 17.09.2011
Сообщений: 143
21.01.2014, 14:24  [ТС]
попробовал все сделать так
C++
1
2
3
4
5
6
7
8
9
10
TCHAR  module[MAX_PATH];
TCHAR szProcessName1[MAX_PATH];
///////////////////////
 GetModuleBaseNameW( hProcess, hMod,szProcessName1 , sizeof(szProcessName1));
        
        GetModuleFileNameEx( hProcess, hMod,module, sizeof(module));
//////////
 MessageBoxW(NULL,(LPCWSTR)md5.digestFile((char*)module), TEXT("Info"),MB_OK);  // тут я что то не понял что намудрил но выдает теперь как квадратикb заместо ммммммммммммм  типо [][][][][][][][][][]
 
     MessageBoxW(NULL,(LPCWSTR) module,TEXT("Info"),MB_OK);// тут все норм выдает
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
22.01.2014, 05:47
объясню на пальцах.
если ты задаешь массив char[12] т.е. на 12 символов, то он в памяти займет 12 байт и строка "primer" будет выглядеть примерно так [p][r][i][m][e][r][][][][][][] - по символу на байт
если же использовать юникод, wchar_t[6] то это будет по 2 байта на символ, итого тоже 12 байт, и строка "primer" теперь будет выглядеть в памяти грубо говоря так [p][p'][r][r'][i][i'][m][m'][e][e'][r][r']

функция GetModuleFileNameEx записывает свой результат в виде wchar_t*
ты же ее обманываешь и подсовываешь char*, но оператором приведения (LPWSTR) говоришь что это wchar_t*
и у тебя получается в память char[12] запишется [p][p'][r][r'][i][i'][m][m'][e][e'][r][r'] что с точки зрения char совсем не "primer", а не пойми что.
теперь этот массив можно использовать и дальше, при этом указывая что это wchar_t*.
но использовать его как char уже не получится и никакое приведение не поможет, нужна обратная конвертация символов, а потому проще сразу делать правильно, как сказал Убежденный

Цитата Сообщение от Убежденный Посмотреть сообщение
Выхода два - либо везде использовать TCHAR (вместо char или wchar_t), а имена функций и
структур писать нейтральные к типу символа (MessageBox вместо MessageBoxA или MessageBoxW,
WNDCLASSEX вместо WNDCLASSEXA или WNDCLASSEXW и т.д.), либо наоборот - всегда точно
указывать тип символа и соответствующие варианты функций - char/MessageBoxA/WNDCLASSEXA или
wchar_t/MessageBoxW/WNDCLASSEXW.
в частности в последнем примере ты начинаешь использовать TCHAR, но потом пишешь
MessageBoxW LPCWSTR
1
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
22.01.2014, 10:06
Вот здесь кстати можно немножко почитать в дополнение: Что такое TCHAR, WCHAR, LPSTR, LPWSTR,LPCTSTR (итд).
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.01.2014, 10:06
Помогаю со студенческими работами здесь

Получение списка запущенных процессов
Подскажите пожалуйста три вещи: 1. Как получить идентификатор потока (синим цветом - это я что-то пробовал сделать) 2. Как получить...

Получение списка запущенных процессов (EnumProceess)
Добрый день всем, 4ый день сижу и страдаю над получением списка процессов и его вывода в listWidget, а получаю все одни и те же ошибки в...

Получение списка запущенных на удаленном компьютере процессов
Всем привет...подскажите пожалуйста,как можно получить список запущенных процессов на удаленном компе...если получится код программы

Завершение всех запущенных процессов из находящегося в текстовом файле списка запрещенных к запуску процессов
пожалуйста помогите написать батник. Задать в текстовом файле список процессов, запрещенных к запуску. Создать командный файл,...

Перечисление запущенных процессов
Уважаемые подскажите кто знает. Пробовал различными способами и с TlHelp32,и с PSAPI получить процессы.Но возникла проблема отображаются не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru