![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ERROR_MR_MID_NOT_FOUND и как с ней бороться ?
Riply © (2007-04-27 02:06:00)Здравствуйте !
В последнее время, GetLastError повадился часто выдавать САБЖ - ую ошибку:
"The system cannot find message text for message number 0x%1 in the message file for %2."
(Наверное, ему просто лень искать :)
Причем после простейших операций типа: GetOverlappedResult, ReadFileEx и т.п.
Подскажите, пожалуйста, с чем это может быть связано и как бороться ?
Сергей М. (2007-04-27 13:59:00) [21]
> Riply © (27.04.07 13:27) [16]
> Я, как прилежный и старательный ученик, делаю все "по Help'у"
Ты замечательный ученик, но в этот раз ты, думаю, облажалась - именно в Help'е (по кр.мере - Д7) нет такого комментария. Оной действительно имеется в соотв.топике в MSDN, но там явно указаны условия :
Server
Requires Windows Server "Longhorn", Windows Server 2003, Windows 2000 Server, or Windows NT Server.
Ты их "соблюла" ?
Вряд ли)..
Riply (2007-04-27 13:57:00) [22]> [19] Игорь Шевченко © (27.04.07 13:51)
>Я не увидел в коде где ты убеждаешься, что возникает именно эта ошибка
Приношу извинения, что не пояснила смысл всех функций.
ReadErr := GetLastError;
Post_PipeError(ReadErr, 'TChannel._ReadPipeEx--->ReadFileEx--->True');
Отправляет ошибку "на эран" и записывает в лог.
Игорь Шевченко (2007-04-27 13:51:00) [23]Riply © (27.04.07 13:45) [18]
> Она возникает после ReadFileEx, когда он возвращает True.
Я не увидел в коде где ты убеждаешься, что возникает именно эта ошибка
Riply (2007-04-27 13:45:00) [24]>[15] Игорь Шевченко © (27.04.07 13:26)
>Ты не привела код, где возникает указанная тобой ошибка, разве я могу сказать, где надо искать ?
Она возникает после ReadFileEx, когда он возвращает True.
>GetLastError в принципе не может выдавать подобную ошибку,
>GetLastError выдает 32-х битное число, а не текст.
:) Ну я просто привела ее описание(чтобы не надо было искать)
>> ERROR_MR_MID_NOT_FOUND
>Эта ошибка является внутренней ошибкой NT и связана с
>невозможностью преобразовать значение NTSTATUS в ошибку Win32.
И что же надо умудрится натворить, чтобы она стала появляться ?
Riply (2007-04-27 13:38:00) [25]>[14] Сергей М. © (27.04.07 13:25)
>Кстати, тебе на заметку - начиная с Vista и Longhorn появилась оч полезная ф-ция CancelIoEx, позволяющая >потоку прерывать и синхронные и асинхронные операции ввода-вывода, стартованные в других потоках тек.процесса. >Отныне можно не заморачиваться асинхронными пайп-операциями.
Я на Visty, пока еще не накопила:)
А кто такой "Longhorn" ?
Riply (2007-04-27 13:27:00) [26]> [13] Сергей М. © (27.04.07 13:11)
>Вот твоя "засада":
>if ReadFileEx(..) then
>begin // <- функция ReadFileEx выполнена успешно
>ReadErr := GetLastError; <- о каком же коде какой ошибки при этом может идти речь ?
Я, как прилежный и старательный ученик, делаю все "по Help'у" :)
"When using ReadFileEx you should check GetLastError even when the function returns "success"
to check for conditions that are "successes" but have some outcome you might want to know about.
For example, a buffer overflow when calling ReadFileEx will return TRUE,
but GetLastError will report the overflow with ERROR_MORE_DATA.
If the function call is successful and there are no warning conditions,
GetLastError will return ERROR_SUCCESS."
Игорь Шевченко (2007-04-27 13:26:00) [27]Сергей М. © (27.04.07 13:11) [13]
> if ReadFileEx(..) then
> begin // <- функция ReadFileEx выполнена успешно
> ReadErr := GetLastError; <- о каком же коде какой ошибки
> при этом может идти речь ?
"When using ReadFileEx you should check GetLastError even when the function returns "success" to check for conditions that are "successes" but have some outcome you might want to know about. For example, a buffer overflow when calling ReadFileEx will return TRUE, but GetLastError will report the overflow with ERROR_MORE_DATA. If the function call is successful and there are no warning conditions, GetLastError will return ERROR_SUCCESS."
(с) Platform SDK
Riply © (27.04.07 12:46) [12]
> А можно хотя бы намек на тип ошибки, которую надо искать
> и
> которая себя проявляет столь необычным образом :)
Ты не привела код, где возникает указанная тобойошибка, разве я могу сказать, где надо искать ?
> В последнее время, GetLastError повадился часто выдавать
> САБЖ - ую ошибку:
> "The system cannot find message text for message number
> 0x%1 in the message file for %2."
GetLastError в принципе не может выдавать подобную ошибку, GetLastError выдает 32-х битное число, а не текст.
> ERROR_MR_MID_NOT_FOUND
Эта ошибка является внутренней ошибкой NT и связана с невозможностью преобразовать значение NTSTATUS в ошибку Win32.
Сергей М. (2007-04-27 13:25:00) [28]Кстати, тебе на заметку - начиная с Vista и Longhorn появилась оч полезная ф-ция CancelIoEx, позволяющая потоку прерывать и синхронные и асинхронные операции ввода-вывода, стартованные в других потоках тек.процесса. Отныне можно не заморачиваться асинхронными пайп-операциями.
Сергей М. (2007-04-27 13:11:00) [29]
> Riply © (27.04.07 12:46) [12]
Вот твоя "засада":
if ReadFileEx(..) then
begin // <- функция ReadFileEx выполнена успешно
ReadErr := GetLastError; <- о каком же коде какой ошибки при этом может идти речь ?
Riply (2007-04-27 12:46:00) [30]>[10] Сергей М. © (27.04.07 08:46)
>ПРиведи реальный фрагмент кода, где происходит сабж ..
function TChannel._ReadPipeEx(const pData: PByte; const cbData: DWord;
const pCallBack: FARPROC; var ReadErr: DWord): Boolean;
var
AddedSize: DWord;
begin
if ReadFileEx(FhPipe, pData, cbData, @FOverLapRead, pCallBack)
then
begin
ReadErr := GetLastError;
Post_PipeError(ReadErr, 'TChannel._ReadPipeEx--->ReadFileEx--->True');
if ReadErr = ERROR_MORE_DATA then
begin// ни разу сюда не попала, хотя и отправляла заведомо больший объем данных
if PeekNamedPipe(FhPipe, nil, 0, nil, nil, @AddedSize) then
begin
// Здесь планирую разбираться с "лишними данными"
end
else
begin
ReadErr := GetLastError;
Post_PipeError(ReadErr, 'TChannel._ReadPipeEx--->PeekNamedPipe');
end;
end;
ReadErr := ERROR_SUCCESS;// Временная мера из-за ERROR_MR_MID_NOT_FOUND
end
else ReadErr := GetLastError;
Result := IsErrorOverlapped(ReadErr);
if not Result then
begin
FLastErr := ReadErr;
SetLastCallBackEvent(True);
end
else inc(FRequest);
end;
>[11] Игорь Шевченко © (27.04.07 10:29)
>Наверное у тебя в программе ошибка
:)
А можно хотя бы намек на тип ошибки, которую надо искать и
которая себя проявляет столь необычным образом :)
Игорь Шевченко (2007-04-27 10:29:00) [31]
> В последнее время, GetLastError повадился часто выдавать
> САБЖ - ую ошибку:
> "The system cannot find message text for message number
> 0x%1 in the message file for %2."
Наверное у тебя в программе ошибка
Сергей М. (2007-04-27 08:46:00) [32]
> Riply © (27.04.07 03:45) [8]
ПРиведи реальный фрагмент кода, где происходит сабж ..
Riply (2007-04-27 03:49:00) [33]>[7] {RASkov} © (27.04.07 03:21)
>Ну так может это как раз то:
This is a misleading error because the kernel driver error
is STATUS_ILL_FORMED_SERVICE_ENTRY which exactly describes the problem:
A registry entry of Direct I/O is damaged.
But Microsoft didn't manage to translate this error to user mode.
Solution: Reinstall Direct I/O.
Вот это "мне не совсем понятно и совсем не нравяться" :)
Можно "на пальцах" объяснить "что это еще за чертовщина" ? :)
Riply (2007-04-27 03:45:00) [34]> [6] Джо © (27.04.07 03:15)
>А вообще контекст действий-то какой?
Общаются клиент и сервер при помощи ReadFile(Ex), WriteFile(Ex) и BindIoCompletionCallback.
GetLastError стал возвращать эту ошибку после вызова различных функций, например после вызова ReadFileEx
пытаюсь получить ошибку ERROR_MORE_DATA, а получаю САБЖ. Также это бывает и после вызова GetOverlappedResult
{RASkov} (2007-04-27 03:21:00) [35]> [5] Riply © (27.04.07 03:08)
> Меня интересует почему, вместо "нормальных" ошибок (типа ERROR_INVALID_HANDLE)
> по которым понятно "что не так",
> GetLastError часто стал возвращать именно ее ?
Ну так может это как раз то:
> ERROR_MR_MID_NOT_FOUND
> This is a misleading error because the kernel driver error
> is STATUS_ILL_FORMED_SERVICE_ENTRY which exactly describes the problem:
> A registry entry of Direct I/O is damaged.
> But Microsoft didn't manage to translate this error to user mode.
> Solution: Reinstall Direct I/O.
Джо (2007-04-27 03:15:00) [36]> [5] Riply © (27.04.07 03:08)
> GetLastError часто стал возвращать именно ее ?
А вообще контекст действий-то какой?
Riply (2007-04-27 03:08:00) [37]>[0] Riply © (27.04.07 02:06)
Наверное, я опять плохо объяснила :(
Меня интересует почему, вместо "нормальных" ошибок (типа ERROR_INVALID_HANDLE)
по которым понятно "что не так",
GetLastError часто стал возвращать именно ее ?
Riply (2007-04-27 02:57:00) [38]>[2] {RASkov} © (27.04.07 02:50)
> http://megalib.com/books/26/appx/appx1.htm
Спасибо, конечно, но перевести эту строчку:
"The system cannot find message text for message" на русский я и так была в состоянии :)
Riply (2007-04-27 02:50:00) [39]> [1] Германн © (27.04.07 02:21)
А Гугл выдает какие-то странные советы типа:
ERROR_MR_MID_NOT_FOUND
This is a misleading error because the kernel driver error
is STATUS_ILL_FORMED_SERVICE_ENTRY which exactly describes the problem:
A registry entry of Direct I/O is damaged.
But Microsoft didn't manage to translate this error to user mode.
Solution: Reinstall Direct I/O.
Что-то такие советы мне не совсем понятны и совсем не нравяться :)
{RASkov} (2007-04-27 02:50:00) [40]http://megalib.com/books/26/appx/appx1.htm