purebasic.info

PureBasic forum
Текущее время: Вс янв 21, 2018 11:31 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: Решение проблем с DOS-кодировкой
СообщениеДобавлено: Чт янв 17, 2008 3:13 pm 
Не в сети
док

Зарегистрирован: Вт сен 18, 2007 9:16 am
Сообщений: 162
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Сопсстна.. Этот вопрос уже обсуждался.. подытожим...
В КодАрхиве есть пример перехвата stdout консольной программы ping.
В русской винде, ясен пень, результат будет набором крякозябр что не есть гуд. Проблема решается так (строка mOutputs содержит текст в OEM-кодировке):

Код:
1
2
3
4
5
6
7
8
9
10
aa.s = Space(255) ; создаем буфер для OemToChar_
; The OemToChar function translates a string from the OEM-defined character set into either an ANSI or a wide-character string. (OEM stands for original equipment manufacturer.)
;
; BOOL OemToChar(
;   LPCSTR lpszSrc,  // pointer to string to translate
;   LPTSTR lpszDst   // pointer to buffer for translated string
; );
 
OemToChar_(@mOutputs, @aa)
MessageRequester("Info",aa,0)



Результат:
Код:
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
; English forum: http://www.purebasic.fr/english/viewtopic.php?t=6544&highlight=
; Author: Rings
; Date: 13. June 2003
; OS: Windows
; Demo: No
 
 
; Redirect the output from a compiler ....
 
 
; Redirect Outputs into Memory
; coded by Siegfried Rings march 2002
; redirected the pipes
;
;see http://support.microsoft.com/default.aspx?scid=kb;EN-US;q173085
;
; fixed - SofT MANiAC, 14.01.2008
;
 
mCommand.s="ping"
 
;Structure used by the CreateProcessA function
;another then that Fred implemented !
Structure MySTARTUPINFO
  cb.l
  lpReserved.l
  lpDesktop.l
  lpTitle.l
  dwX.l
  dwY.l
  dwXSize.l
  dwYSize.l
  dwXCountChars.l
  dwYCountChars.l
  dwFillAttribute.l
  dwFlags.l
  wShowWindow.w
  cbReserved2.w
  lpReserved2.l
  hStdInput.l
  hStdOutput.l
  hStdError.l
EndStructure
 
proc.PROCESS_INFORMATION ;Process info filled by CreateProcessA
ret.l ;long variable For get the Return value of the
start.MySTARTUPINFO ;StartUp Info passed To the CreateProceeeA
sa.SECURITY_ATTRIBUTES ;Security Attributes passeed To the
hReadPipe.l ;Read Pipe handle created by CreatePipe
hWritePipe.l ;Write Pite handle created by CreatePipe
lngBytesread.l ;Amount of byte Read from the Read Pipe handle
strBuff.s=Space(256) ;String buffer reading the Pipe
 
;Consts For functions
#NORMAL_PRIORITY_CLASS = $20
#STARTF_USESTDHANDLES = $100
#STARTF_USESHOWWINDOW = $1
 
;Create the Pipe
sa\nLength =SizeOf(SECURITY_ATTRIBUTES) ;Len(sa)
sa\bInheritHandle = 1
sa\lpSecurityDescriptor = 0
ret = CreatePipe_(@hReadPipe, @hWritePipe, @sa, 0)
If ret = 0
  ;If an error occur during the Pipe creation exit
  MessageRequester("info", "CreatePipe failed. Error: ",0)
  End
EndIf
 
 
start\cb = SizeOf(MySTARTUPINFO)
start\dwFlags = #STARTF_USESHOWWINDOW | #STARTF_USESTDHANDLES
 
;set the StdOutput And the StdError output To the same Write Pipe handle
start\hStdOutput = hWritePipe
start\hStdError = hWritePipe
 
;Execute the command
ret = CreateProcess_(0, mCommand, sa, sa, 1, #NORMAL_PRIORITY_CLASS, 0, 0, @start, @proc)
 
If ret <> 1
  MessageRequester("Info","File Or command not found", 0)
  End
Else
  ;MessageRequester("Info","PRG started..:",0)
EndIf
 
 
;Now We can ... must close the hWritePipe
ret = CloseHandle_(hWritePipe)
 
mOutputs.s = ""
 
;Read the ReadPipe handle
While ret<>0
  ret = ReadFile_(hReadPipe, strBuff, 255, @lngBytesread, 0)
  If lngBytesread>0
    mOutputs = mOutputs + Left(strBuff, lngBytesread)
  EndIf
Wend
 
;Close the opened handles
ret = CloseHandle_(proc\hProcess)
ret = CloseHandle_(proc\hThread)
ret = CloseHandle_(hReadPipe)
;ret=CloseHandle_(hWritePipe)
 
;Return the Outputs property with the entire DOS output
aa.s = Space(255)
OemToChar_(@mOutputs, @aa)
MessageRequester("Info",aa,0)



-----

Другой вариант - использование OemToCharBuff (транслирует определенное количество символов):
Код:
1
2
3
4
5
6
7
The OemToCharBuff function translates a specified number of characters in a string from the OEM-defined character set into either an ANSI or a wide-character string. (OEM stands for original equipment manufacturer.) 
 
BOOL OemToCharBuff(
  LPCSTR lpszSrc,      // pointer to string to translate
  LPTSTR lpszDst,      // pointer to buffer for translated string
  DWORD cchDstLength   // size of buffer
);



В этом случае код будет выглядеть так:
Код:
1
OemToCharBuff_(@mOutputs, @aa, Len(mOutputs))



-----

Обратите внимание, что я выставлял в качестве размера буфера 255, но я думаю вы дальше сами разберетесь что к чему...

_________________
Люди!! Уважайте друг друга!


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB