![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Объясните в чём ошибка (надеюсь не в ДНК ;) [D6, Win95/98, WinME]
Fellomena © (2002-01-21 11:30:00)Всем привет !
Кто может объяснить почему не получается грузить иконки из dll, хотя загрузка строк происходит нормально,
что бы понятно всё было, привожу весь код:
************************************************ rc file start *********************************************
STRINGTABLE
BEGIN
21, "MyTheardString"
END
************************************************ rc file end *********************************************
Компилю его и получаю RES файл, далее пишу dll:
************************************************ DLL code start *********************************************
library RsDll3;
{$R mystrings.RES}
begin
end.
************************************************ DLL code end ***********************************************
Компилирую - получаю *.dll файл, далее в файле проекта:
************************************************ Project code start *****************************************
...
uses
...
var
Form1: TForm1;
hDLL : THandle;
...
implementation
procedure TForm1.Button1Click(Sender: TObject);
begin
hDll:=LoadLibraryEx("RsDll3.dll",0,LOAD_LIBRARY_AS_DATAFILE); {гружу библиотеку, как файл-ресурсов (ENTERY POIT отсутствует, как я поняла)}
if hDll <> 0 then Form1.Caption:=IntToStr(hDll) + " Loaded !!!";
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FreeLibrary(hDll);
FreeLibrary(hDll2);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
buf1: array [0..100] of Char;
begin
// вывод текста из RsDll3.dll
LoadString(hDll,21,@buf1,99); {указываю handle dll, загруженной в АП моей проги, где 21 - имя строки}
ShowMessage(String(buf1)); // всё работает нормально !!!
end;
...
************************************************ Project code end *******************************************
Далее делаю следующее: создаю новый rc файл (по правилам вроде - Resource Workshop-овские файлы раздраконила и посмотрела как надо,
на всякий случай):
************************************************ rc file start *********************************************
ICON1 ICON barsdi.ico
ICON2 ICON folder.ico
************************************************ rc file end *********************************************
Компилирую, получаю myicons.RES, далее DLL:
************************************************ DLL code start *********************************************
library RsDll2;
{$R myicons.RES}
begin
end.
************************************************ DLL code end ***********************************************
Получаю RsDll2.dll, далее в файле проекта:
************************************************ Project code start *****************************************
...
uses
...
var
Form1: TForm1;
hDLL2 : THandle;
...
implementation
procedure TForm1.Button3Click(Sender: TObject);
begin
hDll2:=LoadLibraryEx("RsDll2.dll",0,LOAD_LIBRARY_AS_DATAFILE);
if hDll2 <> 0 then Form1.Caption:=IntToStr(hDll2) + " Loaded 2 !!!"; // загрузка проходит нормально
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
и пробую следующие варианты - ничего не работает (иконка не меняется)
//Icon.Handle:=LoadIcon(hDll2, "ICON1");
//Form1.Icon.Handle:=LoadIcon(FindResource(hDll2, "ICON1", RT_ICON), "ICON1");
//Icon.Handle:=LoadResource(hDll2, FindResource(hDll2, "ICON1", RT_ICON));
ShowMessage(IntToStr(LoadIcon(hDll2, "ICON1"))); // LoadIcon возвращает null 8(
end;
...
************************************************ Project code end *****************************************
Я пробовала ещё несколько вариантов из SDK но ничего толкового не вышло, при Application.Icon.Handle:=LoadIcon(hDll2, "ICON!");
приложению присваевается иконка, предназначенная по умолчанию для такого типа приложений системой (это и понятно, если LoadIcon
возвращает null).
Объясните почему строковые ресурсы грузытся, а RT_ICON отказывается ?
И на кой ляд нужен этот грёбаный hInstance если есть Handle, однозначно определяющий окно/модуль/процесс да вообще всё что угодно ?
И если dll с ресурсами грузится в АП мого процесса (вернее процесс грузит dll ;) то почему я не могу указать в качестве hInstance
hInstanse моего приложения, ведь по идее оно содержит в себе то что мне надо... ???
Одним словом, мастера, разъясните ситуацию plz...
Fellomena (2002-01-21 11:52:00) [21]2 IronHawk: а в чём прикол ? Разве при Ctrl+F9 не происходит полного перекомпелирования (новой сборки)?
2 Юрий Федоров: кто бы мне объяснил зачем вообще используют hInstance ? (HWND, ProcessID, Handle - с этим уже всё понятно 8)
Юрий Федоров (2002-01-21 11:43:00) [22]Единственное, что можно сказать наверняка :
в случае загрузки иконки их библиотеки нужно использовать не
hInstance, а Handle, который вернула LoadLibrary
IronHawk (2002-01-21 11:41:00) [23]Удали *.ехе файл и перекомпиль ...
Fellomena (2002-01-21 11:33:00) [24]в первом примере TForm1.FormClose() - не из той сказки - sorry