Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Вниз

Runtime пакеты   Найти похожие ветки 

 
Суслик ©   (2005-11-09 17:02) [0]

Есть пакеты A и B. В секции requires пакета А указан пакет В.
Приложение не содержит ни А ни В в списке runtime пакетов.
Прилоежнеие выполняет загрузку А - LoadPackage(A). Если пакета В нет, то возникает сообщение windows, которое не получатеся подавить.

Замечу, что если бы не было пакета А, то сообщения не было бы, т.к. загрузка А выполняется функцией SafeLoadLibrary, которая и подавляет сообщение.

Как сделать так, чтобы сообщения об отстутствии В не выводилось, а в приложении возбуждалось исключение?


 
Digitman ©   (2005-11-09 17:09) [1]

если приложение выполняет статическую загрузку А - никак.


 
Суслик ©   (2005-11-09 17:13) [2]

приложение выполняет ДИНАМИЧЕСКУЮ загрузку А.
При этом приложение ничего не знает о В. А содержит В в секции requires.


 
Sam Stone ©   (2005-11-09 17:18) [3]

Вот А и ругается на В. Точнее на отсутствие. Потому что В нет/не загружено, а А зависит от В. Грузи сперва В, потом А, или проверяй наличие В в папке/системе.


 
Суслик ©   (2005-11-09 17:20) [4]


>  [3] Sam Stone ©   (09.11.05 17:18)


Это я понимаю, что могу сначала загрузить В.
Но вообще говоря это не обязательно - пакет А сам умеет загружать В.

Хотелось бы ументь давить сообщения и получать exception.


 
Digitman ©   (2005-11-09 17:25) [5]

в WinAPI на то, кажется, есть соотв. ф-ции ... позволяющие указать, следует ли системе в дан.случае реагировать именно таким образом


 
Leonid Troyanovsky ©   (2005-11-09 17:27) [6]


> Суслик ©   (09.11.05 17:20) [4]

> Хотелось бы ументь давить сообщения и получать exception.



SetErrorMode, чтобы возбуждать исключение в вызывающем LoadLibrary.

--
Regards, LVT.


 
Суслик ©   (2005-11-09 17:30) [7]

SetErrorMode?

Ну я же про то и говорю, что LoadPackage именно это и делает, т.е. одавляет возможное сообщение при загрузке пакета А. Когда же А загружает В - тут не давится.

Сейчас посмотрю - может я в чем-то облажался...


 
Суслик ©   (2005-11-09 17:37) [8]

Не... так не получится.

LoadPackage вызывает SafeLoadLibrary.
SafeLoadLibrary устанавливает SetErrorMode SEM_NOOPENFILEERRORBOX.
И вот на загрузку A это влияет - т.е. сообщения window нет.
А вот за последующие загружки В не влияет - сообщение windows есть.

Похоже, что вообще нельзя сделать, то что мне нужно.


 
Игорь Шевченко ©   (2005-11-09 23:06) [9]

Суслик ©   (09.11.05 17:37) [8]

Пакет А статически связан с пакетом В. Поэтому, загружая пакет A ты автоматически пытаешься загрузить пакет B. Насколько мне известно, "To enable or disable error messages displayed by the loader during DLL loads, use the SetErrorMode function.", то есть, все сообщения, генерируемые загрузчиком, в том числе и отсутствие доплнительных статически связанных библиотек, должны подавляться.

Ты хоть напиши пример из двух строк и скажи, какое именно сообщение выдается при его запуске.


 
Суслик ©   (2005-11-10 10:54) [10]

да написал я все.

try
  LoadPackage("a")
except
  ShowMessage("a not found");
  raise;
end;


При выполнении такого кода:
1. Если нет библиотеки а, то выдается МОЕ сообщение - a not found.
2. Если а есть, а в нет, то сначала выводится сообщение windows, о том, что не нашлась в, а затем мое сообщение.


 
Суслик ©   (2005-11-15 11:35) [11]

Вот, что сказал Peter Below (TeamB)  на новостной группе по данному сабжу:

Weird. The error mode should be set to SEM_NOOPENFILEERRORBOX by the
SafeLoadLibrary call in the LoadPackage of A when the Windows program
loader tries to load the missing B package. No idea why it still pops up
the message, sorry.


Я вообще не понял - проблемы с появлением сообщения windows только у меня присутствуют? Т.е. судя по по ответу товарища из Борланда - у него все работает нормально, вот у меня нет (скорее я так понял).

Если не трудно, то посмотрите этот код http://webfile.ru/633883.
Нужно в поле ввести путь до А. Нажать кнопку. Если А не найден, то сообщения windows не будет. Но если B не найден, то сообщение будет.

У вас также? Или это только мои глюки?

Спасибо.


 
Игорь Шевченко ©   (2005-11-15 11:51) [12]


> Т.е. судя по по ответу товарища из Борланда - у него все
> работает нормально


Нет, он не знает, почему выдается сообщение.


 
Leonid Troyanovsky ©   (2005-11-15 12:03) [13]


> Суслик ©   (15.11.05 11:35) [11]

> Т.е. судя по по ответу товарища из Борланда


Кстати, Peter не из Борланда (и никогда там не работал).
TeamB - это, скажем, модераторы борландовских конференций
(просто, как правило, это люди с заслугами и авторитетом).

--
Regards, LVT.


 
Суслик ©   (2005-11-15 12:41) [14]


> Нет, он не знает, почему выдается сообщение.


он не понял почему конкретно у меня выдается сообщение или почему вообще оно выдается?

Вообще здесь даже вопрос не к борланду а к знатокам windows.

Такое ощущение, что при статической загрузке dll (а именно она, если не ошибаюсь, присутствует при загрузке пакетов из секции required) вообще невозможно "погасить" сообщения.


 
Игорь Шевченко ©   (2005-11-15 13:23) [15]


> Такое ощущение, что при статической загрузке dll (а именно
> она, если не ошибаюсь, присутствует при загрузке пакетов
> из секции required) вообще невозможно "погасить" сообщения.
>


Загрузчик вызывает HardError в случае статической линковки.

Я добился отмены показа сообщения, но способ тебе рекомендовать не могу - non-portable


 
Суслик ©   (2005-11-15 13:44) [16]

понятно. будем мириться.


 
Игорь Шевченко ©   (2005-11-15 13:48) [17]

Суслик ©   (15.11.05 13:44) [16]

Для NT-систем (Win2k, XP) это выглядит следующим образом:

unit main;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls;

type
 TfMain = class(TForm)
   btnLoad: TButton;
   CheckBox1: TCheckBox;
   procedure btnLoadClick(Sender: TObject);
   procedure CheckBox1Click(Sender: TObject);
 private
   FMustDisableHardErrors: Boolean;
   FOldErrorMode: DWORD;
   procedure DisableHardErrors;
   procedure EnableHardErrors;
 end;

var
 fMain: TfMain;

implementation

{$R *.DFM}

function GetHardErrorMode: DWORD; assembler;
asm
 mov eax,fs:[24]
 mov eax,[eax+$0F28]
end;

procedure SetHardErrorMode (const Value: DWORD); assembler;
asm
 push ecx
 mov ecx,Value
 mov eax,fs:[24]
 mov [eax+$0F28],ecx
 pop ecx
end;

procedure TfMain.btnLoadClick(Sender: TObject);
var
 HPackage: HMODULE;
 PackageProc: TProcedure;
begin
 DisableHardErrors;
 try
   try
     HPackage := LoadPackage ("a.bpl");
   except
     on E: Exception do begin
       ShowMessageFmt ("can""t load a.bpl: %s", [E.Message]);
       HPackage := 0;
     end;
   end;
 finally
   EnableHardErrors;
 end;
 if HPackage <> 0 then begin
   @PackageProc := GetProcAddress(HPackage, "ShowA");
   PackageProc;
 end;
end;

procedure TfMain.CheckBox1Click(Sender: TObject);
begin
 FMustDisableHardErrors := not FMustDisableHardErrors;
 CheckBox1.Checked := FMustDisableHardErrors;
end;

procedure TfMain.DisableHardErrors;
begin
 if FMustDisableHardErrors then begin
   FOldErrorMode := GetHardErrorMode;
   SetHardErrorMode (1);
 end;
end;

procedure TfMain.EnableHardErrors;
begin
 if FMustDisableHardErrors then
   SetHardErrorMode (FOldErrorMode);
end;

end.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.036 c
5-1115894879
Almaz
2005-05-12 14:47
2005.12.11
Свойство типа TShortCut у наследника TCollectionItem


2-1132551144
KitsumVI
2005-11-21 08:32
2005.12.11
Композитивный класс


14-1132222541
Vlad Oshin
2005-11-17 13:15
2005.12.11
Написал заявление. Нафиг.


2-1132637227
Рафик
2005-11-22 08:27
2005.12.11
Из Delphi3 в Delphi7


1-1131685235
Andrey V.
2005-11-11 08:00
2005.12.11
Internal error: L1496





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский