Dll в ресурсах
Модератор: Модераторы
Dll в ресурсах
Здравствуйте всем.
Для работы многих программ требуются внешние частные dll-ки.Зачастую это упускается из виду и файл ЕХЕ копируется без нее.И даже в Интернете неопытные пользователи нередко дают на скачку только сами экзешники.Дабы такого не случилось с писаной мной програмой я решил пристыковать эту самую сопутствующую dll-ку к моему экзешнику,чтобы потом при запуске програма сама извлекла ее оттуда оттуда и сделала нормальным отдельным файлом в той же директории,что и экзешник.Код нашел в Интерете,он нетрудный.Но организовать сам процесс контроля наличия и создания внешнего файла оказался для меня не из простых.
Привожу часть кода.
program MyProg;
{$IFDEF FPC}
{$MODE Delphi}
{$ENDIF}
uses
{$IFNDEF FPC}
{$ELSE}
Interfaces,
{$ENDIF}
Forms,SysUtils,Dialogs,Classes, //здесь подключены модули,необходимые для работы нижеследующих процедур
Unit1 in 'Unit1.pas' {Form1}; а этот модуль,по сути сама моя программа,требует внешней MyProg.dll
{$R *.res}
{$R MyProg.RES}
//извлекаем MyProg.dll из ресурса
procedure DllFromRes;
var
MyDll1: TResourceStream;
begin
MyDll1 := TResourceStream.Create(hInstance,'M1','RCDATA');
try
MyDll1.SaveToFile('MyProg.dll');
finally
MyDll1.Free;
end; {try}
end;
begin
if not FileExists('MyProg.dll') then DllFromRes;//извлекаем из ресурса MyProg.dll
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Компиляция идет без проблем.Но когда запустить сам экзешник окно алерта пишет,что программа не может запуститься из-за отсутствия MyProg.dll
Я понимаю,прежде чем стартовать,программа проверяет наличие компонентов по-порядку для всех перечисленных модулей.И вот,не найдя этой самой dll-ки для модуля Unit1 выводит алерт и стопируется.До распаковки дело еще даже не дошло,хотя сама dll-ка спокойно сидит в ресурсах того самого экзешника.Думаю изложил все предельно ясно.
ВОПРОС: Уважаемые эксперты.Подскажите,а может и напишите кусочек кода,как выйти из ситуации.Нужно чтобы проверка на наличие внешней dll-ки и ее распаковка в файл начиналась прежде всех прочих проверок.Как быть?
Для работы многих программ требуются внешние частные dll-ки.Зачастую это упускается из виду и файл ЕХЕ копируется без нее.И даже в Интернете неопытные пользователи нередко дают на скачку только сами экзешники.Дабы такого не случилось с писаной мной програмой я решил пристыковать эту самую сопутствующую dll-ку к моему экзешнику,чтобы потом при запуске програма сама извлекла ее оттуда оттуда и сделала нормальным отдельным файлом в той же директории,что и экзешник.Код нашел в Интерете,он нетрудный.Но организовать сам процесс контроля наличия и создания внешнего файла оказался для меня не из простых.
Привожу часть кода.
program MyProg;
{$IFDEF FPC}
{$MODE Delphi}
{$ENDIF}
uses
{$IFNDEF FPC}
{$ELSE}
Interfaces,
{$ENDIF}
Forms,SysUtils,Dialogs,Classes, //здесь подключены модули,необходимые для работы нижеследующих процедур
Unit1 in 'Unit1.pas' {Form1}; а этот модуль,по сути сама моя программа,требует внешней MyProg.dll
{$R *.res}
{$R MyProg.RES}
//извлекаем MyProg.dll из ресурса
procedure DllFromRes;
var
MyDll1: TResourceStream;
begin
MyDll1 := TResourceStream.Create(hInstance,'M1','RCDATA');
try
MyDll1.SaveToFile('MyProg.dll');
finally
MyDll1.Free;
end; {try}
end;
begin
if not FileExists('MyProg.dll') then DllFromRes;//извлекаем из ресурса MyProg.dll
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Компиляция идет без проблем.Но когда запустить сам экзешник окно алерта пишет,что программа не может запуститься из-за отсутствия MyProg.dll
Я понимаю,прежде чем стартовать,программа проверяет наличие компонентов по-порядку для всех перечисленных модулей.И вот,не найдя этой самой dll-ки для модуля Unit1 выводит алерт и стопируется.До распаковки дело еще даже не дошло,хотя сама dll-ка спокойно сидит в ресурсах того самого экзешника.Думаю изложил все предельно ясно.
ВОПРОС: Уважаемые эксперты.Подскажите,а может и напишите кусочек кода,как выйти из ситуации.Нужно чтобы проверка на наличие внешней dll-ки и ее распаковка в файл начиналась прежде всех прочих проверок.Как быть?
Re: Dll в ресурсах
Почитайте про динамическое связывание.
Re: Dll в ресурсах
Mr.Smart писал(а):Почитайте про динамическое связывание.
Именно так. Альтернатива - извлекать и сам exe-шник, исполнять его, а потом можно и почистить, но это уже какой-то SFX получается.
Leon писал(а):MyDll1.SaveToFile('MyProg.dll');
Ну а кто разрешал писать в каталог проекта? Нет, я понимаю, все так писали лет 10 назад, а ведь сейчас даже под виндой (семёркой, например) такая программа может потребовать прав администратора, если её устанавливать куда положено. Куда лучше GetTempFileName - и потом LoadLibrary прямо оттуда (некрасиво - но что делать?)
А дальше можно и кроссплатформенность приделать (ресурсы у нас ведь уже поддерживаются под linux, другое дело, как туда запихнуть .so)
Re: Dll в ресурсах
Я эту проблему решил по рабоче-крестьянски типа "матрешка".Пишу программу,которая проверяет есть ли под рукой нужный dll,а если его нет - выводит в файл из ресурсов.Потом эта программа запускает вторую программу,для которой этот dll и придназначен.И все чики-чики...
Тут второй вопрос назрел.Можно ли писаь в Лазарусе программы для Интернета? Ну,например,как отследить свой внешний IP? В компонентах на панели чет я ниче внятного не нашел.В сети есть примеры для Делфи,но в Лазарусе таких компонент не нашлось.Есь какое-то решение таких вопросов в Лазарусе?
Добавлено спустя 20 минут 18 секунд:
PS.Кстати не только dll,но и сам экзешник можно положить "в коробочку ресурсов" первой программы.Она при запуске сама его распакует и запустит как внешнюю программу.Вот такой SFX и получился.
Тут второй вопрос назрел.Можно ли писаь в Лазарусе программы для Интернета? Ну,например,как отследить свой внешний IP? В компонентах на панели чет я ниче внятного не нашел.В сети есть примеры для Делфи,но в Лазарусе таких компонент не нашлось.Есь какое-то решение таких вопросов в Лазарусе?
Добавлено спустя 20 минут 18 секунд:
PS.Кстати не только dll,но и сам экзешник можно положить "в коробочку ресурсов" первой программы.Она при запуске сама его распакует и запустит как внешнюю программу.Вот такой SFX и получился.
Re: Dll в ресурсах
Leon писал(а):Я эту проблему решил по рабоче-крестьянски типа "матрешка"...
На мой взляд это куча минусов. Компилить программу, отлаживать, собирать SFX отлаживать его работу. Много шагово слишком. И подозрения пользователя (вот у меня точно возникнут) из за подозрительной активности с файлами.
Лучше использовать "инсталятор", и сама программа просче, и пользователю спокойнее.
А вот как "вкомпилировать" код dll в программу, чтобы внешний файл не требовался?
Re: Dll в ресурсах
Я думаю никак иначе,как прописать кодом востребованные функции и процедуры конкретной dll-ки прям в своей программе.Может маститые программисты скажут что-то покруче.Другого пути при своем небольшом опыте я пока не вижу.
Re: Dll в ресурсах
Leon писал(а):Ну,например,как отследить свой внешний IP?
Свой внешний IP без наличия внешнего доверенного сервера, который бы сообщил вам, с какого IP пришло на него обращение, узнать принципиально невозможно - в общем случае, это может быть адрес, не принадлежащий вашей машине, не принадлежащий вашей сети, и даже не принадлежащий сети вашего провайдера. Кстати, даже не могу представить, зачем его понадобилось узнавать то.
Re: Dll в ресурсах
Здравствуйте.А вот объясню зачем.Моя банковская карточка ни с того,ни с сего заблокировалась,потому что кто-то тижды пытался ввести неверные данные.В почтовом ящике банковской страницы сохранились Ай-пи адреса неудачных попыток.Ввиду плохой связи преустанавливать Интернет соединение приходится порой частенько.Так я вот думаю,это я неудачно так авторизировался в банке или был кто-то кто мне помогал.С этой целью я решил написать программку,которая через определенный интервал времени просто фиксировала в протокол мой текущий Ай-Пи за каждое календарное число.Просмотрев потом этот протокол и сверив его со списком "неудачно пытавшихся" я увидел бы хоть есть у меня посторонние помощники или я сам по своей занятости оказался лохом.Но в Лазарусе что-т ниче не нашел.Похоже там вообще модули работы с сетью не разработаны.В Интернете есть делфовские примеры.Так что теперь,на Делфи переходить иль как?
Re: Dll в ресурсах
Можно на Delphi, можно посмотреть в сторону Synaptic.
Re: Dll в ресурсах
Leon писал(а):которая через определенный интервал времени просто фиксировала в протокол мой текущий Ай-Пи за каждое календарное число
Ну так у вас на PPP интерфейсе абсолютно не обязательно - находится ваш _внешний_ адрес. Это может быть "серый" адрес вашего провайдера.
Re: Dll в ресурсах
Что быстро удалось найти. Парсите ответе от http://ip-jobs.staff-base.spb.ru/ip.cgi.
- Vapaamies
- постоялец
- Сообщения: 292
- Зарегистрирован: 24.07.2012 22:37:59
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Dll в ресурсах
Вообще, если проблемные IP известны, начать нужно с подсети. Могли ли вы сами из этой подсети выходить?
Например, вот IP домена FreePascal.ru. В строчке inetnum указан диапазон подсети, далее идет имя провайдера и прочее. У больших провайдеров, вроде МТС или "Билайна", в самом низу могут быть указаны региональные подсети, а основной адрес -- в Москве.
Если провайдер не ваш, можно сразу обращаться с жалобой в банк.
Например, вот IP домена FreePascal.ru. В строчке inetnum указан диапазон подсети, далее идет имя провайдера и прочее. У больших провайдеров, вроде МТС или "Билайна", в самом низу могут быть указаны региональные подсети, а основной адрес -- в Москве.
Если провайдер не ваш, можно сразу обращаться с жалобой в банк.
Re: Dll в ресурсах
Код: Выделить всё
wget -q -O- http://checkip.dyndns.org | grep "Current IP Address:" | sed -r 's|.*Current IP Address: ([0-9.]+).*$|\1|g'Re: Dll в ресурсах
Здравствуйте.Тут проблемка завелась крутая.
Есть 2 компа.На компе "А" есть расшаренный сетевой диск (папка) "FоlderNet".
Комп "В" связан с компом "А" вай-фаем в сеть "комп-к-компу".Папку "FоlderNet" видно в Сетевом окружении компа "В".
Из-под Виндоуза,из компа "В" я свободно захожу в эту сетевую папку,открываю и работаю ее файлами.
Задача.Нужно.чтобы программа Делфи (Лазаруса) могла работать с этой папкой (находить в ней определенный файл и работать с ним).Никаких паролей-доступов не нужно.Мне от себя нечего скрывать.
Нашел вверху в браузере пропись "\\pc1\FоlderNet\" и попытался вставить ее в структуру if FileExists('\\pc1\FоlderNet\') then... и у меня ничего не вышло.Не видит Лазарус эту папку.Кто-нить может подсказать как к ней попроще подобраться без длиннющего и заморочливо-непонятного кода.С этим делом я сталкиваюсь впервые и опыта... ну никакого.
Есть 2 компа.На компе "А" есть расшаренный сетевой диск (папка) "FоlderNet".
Комп "В" связан с компом "А" вай-фаем в сеть "комп-к-компу".Папку "FоlderNet" видно в Сетевом окружении компа "В".
Из-под Виндоуза,из компа "В" я свободно захожу в эту сетевую папку,открываю и работаю ее файлами.
Задача.Нужно.чтобы программа Делфи (Лазаруса) могла работать с этой папкой (находить в ней определенный файл и работать с ним).Никаких паролей-доступов не нужно.Мне от себя нечего скрывать.
Нашел вверху в браузере пропись "\\pc1\FоlderNet\" и попытался вставить ее в структуру if FileExists('\\pc1\FоlderNet\') then... и у меня ничего не вышло.Не видит Лазарус эту папку.Кто-нить может подсказать как к ней попроще подобраться без длиннющего и заморочливо-непонятного кода.С этим делом я сталкиваюсь впервые и опыта... ну никакого.
Re: Dll в ресурсах
Leon, а стандартными средствами операционной системы примонтировать удаленный сетевой ресурс в качестве диска системы религия не позволяет? Это вообще-то единственный нормальный способ обращения к данным на сетевом диске, а вот то, что вы собирались сделать, к работе с файловой системой уже не соотносится - это чисто сетевой уровень, насколько помню при нем например нет файлов прямого доступа, только последовательно читаемые потоки.
