![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
WinAPI Return Values and Errors [D7, Win2k]
AlexeyITN © (2004-04-01 16:33:00)Доброго времени суток.
Уважаемые мастера, прошу меня извинить за слишком глупый вопрос, но но но...
Я думал без "этого" обойдусь, а шиш! Программирование как увлечение застопорилось. Вопрос: как правильно обрабатывать ошибки от винды и выдавать их результат юзеру. Например: есть функция, она возвращает 123 (при нуле - успех). Как эти "123" присобачить к конкретным строкам ошибок. Я не понимаю как использовать набор текстовых сообщений и набор кодовых ошибок возвращаемых, в случае не удачи, функцией. Подскажите. Возможно статьёй, ссылкой...Бьюсь как рыба об лёд...:(
Заранее благодарен!
nikkie (2004-04-02 20:27:00) [1]>А в новой версии как оказалось была отключена работа с переменными типа string.
вот ведь собаки! э... а что ты собственно имел в виду?
>Конец истории. :)))
да нет, похоже еще не конец... :)
AlexeyITN (2004-04-02 14:23:00) [2]ранее этот код работал,..но я полез на microsoft.update...поустанавливал критические обновления для винды.
После этого прога перестала работать - я удалил все эти обновления, но, как оказалось :) дядя Били сделал так, что изменнённая netapi32.dll не восстановилась до прежнего состояния. А в новой версии как оказалось была отключена работа с переменными типа string. Конец истории. :)))
AlexeyITN (2004-04-02 14:05:00) [3]позор мне тупорылому....:)
спасибо за помощь!
BiN (2004-04-02 13:54:00) [4]&^%^#$*%^$*^%)*&)_(*&)(%&^$ это я ругался :)
b: widestring
и вместо WMsg := PChaR('-1-'); пиши просто WMsg := '-1-';
AlexeyITN (2004-04-02 13:37:00) [5]var result: integer;
WMsgName : WideString;
WMsg : WideString;
MsgLen : integer;
b:string;
begin
WMsg := PChaR('-1-');
MsgLen := Length(WMsg) * 2; // Unicode is 2-byte.
WMsgName := '-1-'; b:='-1-';
Result := NetMessageBufferSend(nil,
PWideChar(WMsgName), PWideChar(b),
PWideChar(WMsg), MsgLen);
-----------------
имя моего компа: -1-
BiN (2004-04-02 13:31:00) [6]так все ясно
WMsgName := '-1-'; замени на имя компьютера-адресата, и к тому же какого он типа, - надеюсь, Widestring, а не String
BiN (2004-04-02 13:27:00) [7]у тебя очевидно ошибка в параметре MsgName.
Приведи вызов
AlexeyITN (2004-04-02 12:36:00) [8]самое обидное в этой истории это то, что
winexec(PChar(b),SW_HIDE); работает...и с команды run работает...
-----------------------
функцию гружу очень тупо: статически загружаю библиотеку!
-----------------------
после uses
function NetMessageBufferSend(ServerName: LPCWSTR; MsgName: LPCWSTR; FromName: LPCWSTR; Buf: LPCWSTR;
BufLen: DWORD): DWORD; stdcall; external 'netapi32.dll' name 'NetMessageBufferSend';
AlexeyITN (2004-04-02 11:27:00) [9]да, запущена. Это я с самого начала смотрел!
BiN (2004-04-02 11:23:00) [10]а служба сообщений у тебя запущена?
AlexeyITN (2004-04-02 10:57:00) [11]теперь она возвращает:
-----------------------
не удалось найти псевдоним сообщений в сети
-----------------------
название компа указано верно!в чём проблема...?
Набираю...cmd
net helpmsg 2273...пишет что не правильный псевдоним,..или компьютер принимающий сообщение занят...
но я то отсылаю себе!
может прав не хватает!?
(прошу прощения что плавно отошёл от темы"программирование на WINAPI")
nikkie (2004-04-01 19:08:00) [12]>net-функции сами возвращают код ошибки
кроме того, описания кодов ошибок находятся в netmsg.dll. итого:
if (result >= NERR_BASE) and (result <= MAX_NERR) then begin
LoadLibraryEx('netmsg.dll', 0, LOAD_LIBRARY_AS_DATAFILE)
FormatMessage(FORMAT_MESSAGE_FROM_HMODULE)
FreeLibrary(...)
end;
VMcL (2004-04-01 18:50:00) [13]>>AlexeyITN (01.04.04 16:33)
RaiseLastOSError() // D6+
RaiseLastWin32Error()
BiN (2004-04-01 17:33:00) [14]net-функции сами возвращают код ошибки, а не getlasterror.
пиши типа If Result<>0 then
begin
ShowMEssage(Result);
end;
AlexeyITN (2004-04-01 17:24:00) [15]Result := -1;
WMsg := ChaR('!');
MsgLen := Length(WMsg) * 2; // Unicode is 2-byte.
WMsgName := '-1-';
Result := NetMessageBufferSend(nil,
PWideChar(WMsgName), PWideChar(NameOfAdr),
PWideChar(WMsg), MsgLen);
If Result<>0 then
begin
ShowMEssage(SysErrorMessage(GetLastError));
end;
----------------------
Ответ винды: "Протекает наложенное событие ввода/вывода"
----------------------
смотрю MSDN:
----------------------
Return Values
If the function succeeds, the return value is NERR_Success.
If the function fails, the return value can be one of the following error codes.
Return code Description
ERROR_ACCESS_DENIED The user does not have access to the requested information.
ERROR_INVALID_PARAMETER The specified parameter is invalid.
ERROR_NOT_SUPPORTED This network request is not supported.
NERR_NameNotFound The user name could not be found.
NERR_NetworkError A general failure occurred in the network hardware.
-----------------
И как это понять: неужели мой английский настолько плох...или это мой delphi настолько?
AlexeyITN (2004-04-01 17:19:00) [16]да нет, не издеваюсь, ...я просто присваивал результат функции переменной result типа integer, а потом писал SysErrorMessage(result)
BiN (2004-04-01 17:17:00) [17]ты чего издеваешься?
так и пиши SysErrorMessage(GetLastError)
AlexeyITN (2004-04-01 17:12:00) [18]спасибо! Пара вопросов.
- какая разница будет в написании SysErrorMessage и GetLastErorr, если сразу после функции написать SysErrorMessage ?
- как выводить результат функции при помощи GetLastErorr?
BiN (2004-04-01 16:39:00) [19]Бьюсь как рыба об лёд...
sysutils->SysErrorMessage он же FormatMessage из кернел32