Dll в ресурсах

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Dll в ресурсах

Сообщение Leon » 06.12.2012 11:30:20

Здравствуйте всем.
Для работы многих программ требуются внешние частные 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-ки и ее распаковка в файл начиналась прежде всех прочих проверок.Как быть?
Leon
новенький
 
Сообщения: 65
Зарегистрирован: 30.03.2011 09:27:02

Re: Dll в ресурсах

Сообщение Mr.Smart » 06.12.2012 12:03:38

Почитайте про динамическое связывание.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Dll в ресурсах

Сообщение daesher » 06.12.2012 22:06:16

Mr.Smart писал(а):Почитайте про динамическое связывание.

Именно так. Альтернатива - извлекать и сам exe-шник, исполнять его, а потом можно и почистить, но это уже какой-то SFX получается.
Leon писал(а):MyDll1.SaveToFile('MyProg.dll');

Ну а кто разрешал писать в каталог проекта? Нет, я понимаю, все так писали лет 10 назад, а ведь сейчас даже под виндой (семёркой, например) такая программа может потребовать прав администратора, если её устанавливать куда положено. Куда лучше GetTempFileName - и потом LoadLibrary прямо оттуда (некрасиво - но что делать?)
А дальше можно и кроссплатформенность приделать (ресурсы у нас ведь уже поддерживаются под linux, другое дело, как туда запихнуть .so)
daesher
постоялец
 
Сообщения: 221
Зарегистрирован: 09.03.2010 22:17:14

Re: Dll в ресурсах

Сообщение Leon » 07.12.2012 20:32:48

Я эту проблему решил по рабоче-крестьянски типа "матрешка".Пишу программу,которая проверяет есть ли под рукой нужный dll,а если его нет - выводит в файл из ресурсов.Потом эта программа запускает вторую программу,для которой этот dll и придназначен.И все чики-чики... :D
Тут второй вопрос назрел.Можно ли писаь в Лазарусе программы для Интернета? Ну,например,как отследить свой внешний IP? В компонентах на панели чет я ниче внятного не нашел.В сети есть примеры для Делфи,но в Лазарусе таких компонент не нашлось.Есь какое-то решение таких вопросов в Лазарусе?

Добавлено спустя 20 минут 18 секунд:
PS.Кстати не только dll,но и сам экзешник можно положить "в коробочку ресурсов" первой программы.Она при запуске сама его распакует и запустит как внешнюю программу.Вот такой SFX и получился. :?
Leon
новенький
 
Сообщения: 65
Зарегистрирован: 30.03.2011 09:27:02

Re: Dll в ресурсах

Сообщение iN0k » 09.12.2012 00:12:33

Leon писал(а):Я эту проблему решил по рабоче-крестьянски типа "матрешка"...


На мой взляд это куча минусов. Компилить программу, отлаживать, собирать SFX отлаживать его работу. Много шагово слишком. И подозрения пользователя (вот у меня точно возникнут) из за подозрительной активности с файлами.
Лучше использовать "инсталятор", и сама программа просче, и пользователю спокойнее.

А вот как "вкомпилировать" код dll в программу, чтобы внешний файл не требовался?
iN0k
постоялец
 
Сообщения: 146
Зарегистрирован: 18.07.2012 14:09:50

Re: Dll в ресурсах

Сообщение Leon » 12.12.2012 18:50:32

Я думаю никак иначе,как прописать кодом востребованные функции и процедуры конкретной dll-ки прям в своей программе.Может маститые программисты скажут что-то покруче.Другого пути при своем небольшом опыте я пока не вижу.
Leon
новенький
 
Сообщения: 65
Зарегистрирован: 30.03.2011 09:27:02

Re: Dll в ресурсах

Сообщение SSerge » 13.12.2012 05:25:44

Leon писал(а):Ну,например,как отследить свой внешний IP?


Свой внешний IP без наличия внешнего доверенного сервера, который бы сообщил вам, с какого IP пришло на него обращение, узнать принципиально невозможно - в общем случае, это может быть адрес, не принадлежащий вашей машине, не принадлежащий вашей сети, и даже не принадлежащий сети вашего провайдера. Кстати, даже не могу представить, зачем его понадобилось узнавать то.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Dll в ресурсах

Сообщение Leon » 13.12.2012 16:35:32

Здравствуйте.А вот объясню зачем.Моя банковская карточка ни с того,ни с сего заблокировалась,потому что кто-то тижды пытался ввести неверные данные.В почтовом ящике банковской страницы сохранились Ай-пи адреса неудачных попыток.Ввиду плохой связи преустанавливать Интернет соединение приходится порой частенько.Так я вот думаю,это я неудачно так авторизировался в банке или был кто-то кто мне помогал.С этой целью я решил написать программку,которая через определенный интервал времени просто фиксировала в протокол мой текущий Ай-Пи за каждое календарное число.Просмотрев потом этот протокол и сверив его со списком "неудачно пытавшихся" я увидел бы хоть есть у меня посторонние помощники или я сам по своей занятости оказался лохом.Но в Лазарусе что-т ниче не нашел.Похоже там вообще модули работы с сетью не разработаны.В Интернете есть делфовские примеры.Так что теперь,на Делфи переходить иль как?
Leon
новенький
 
Сообщения: 65
Зарегистрирован: 30.03.2011 09:27:02

Re: Dll в ресурсах

Сообщение ZeUsM » 13.12.2012 18:02:20

Можно на Delphi, можно посмотреть в сторону Synaptic.
Аватара пользователя
ZeUsM
новенький
 
Сообщения: 57
Зарегистрирован: 08.11.2010 13:55:35
Откуда: Нерезиновая

Re: Dll в ресурсах

Сообщение SSerge » 13.12.2012 19:16:36

Leon писал(а):которая через определенный интервал времени просто фиксировала в протокол мой текущий Ай-Пи за каждое календарное число


Ну так у вас на PPP интерфейсе абсолютно не обязательно - находится ваш _внешний_ адрес. Это может быть "серый" адрес вашего провайдера.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Dll в ресурсах

Сообщение Mr.Smart » 13.12.2012 20:40:22

Что быстро удалось найти. Парсите ответе от http://ip-jobs.staff-base.spb.ru/ip.cgi.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Dll в ресурсах

Сообщение Vapaamies » 13.12.2012 21:49:10

Вообще, если проблемные IP известны, начать нужно с подсети. Могли ли вы сами из этой подсети выходить?

Например, вот IP домена FreePascal.ru. В строчке inetnum указан диапазон подсети, далее идет имя провайдера и прочее. У больших провайдеров, вроде МТС или "Билайна", в самом низу могут быть указаны региональные подсети, а основной адрес -- в Москве.

Если провайдер не ваш, можно сразу обращаться с жалобой в банк.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: Dll в ресурсах

Сообщение v-t-l » 14.12.2012 15:42:38

Код: Выделить всё
wget -q -O- http://checkip.dyndns.org | grep "Current IP Address:" | sed -r 's|.*Current IP Address: ([0-9.]+).*$|\1|g'
v-t-l
энтузиаст
 
Сообщения: 742
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: Dll в ресурсах

Сообщение Leon » 26.12.2012 01:16:40

Здравствуйте.Тут проблемка завелась крутая.
Есть 2 компа.На компе "А" есть расшаренный сетевой диск (папка) "FоlderNet".
Комп "В" связан с компом "А" вай-фаем в сеть "комп-к-компу".Папку "FоlderNet" видно в Сетевом окружении компа "В".
Из-под Виндоуза,из компа "В" я свободно захожу в эту сетевую папку,открываю и работаю ее файлами.

Задача.Нужно.чтобы программа Делфи (Лазаруса) могла работать с этой папкой (находить в ней определенный файл и работать с ним).Никаких паролей-доступов не нужно.Мне от себя нечего скрывать.

Нашел вверху в браузере пропись "\\pc1\FоlderNet\" и попытался вставить ее в структуру if FileExists('\\pc1\FоlderNet\') then... и у меня ничего не вышло.Не видит Лазарус эту папку.Кто-нить может подсказать как к ней попроще подобраться без длиннющего и заморочливо-непонятного кода.С этим делом я сталкиваюсь впервые и опыта... ну никакого. :(
Leon
новенький
 
Сообщения: 65
Зарегистрирован: 30.03.2011 09:27:02

Re: Dll в ресурсах

Сообщение SSerge » 26.12.2012 05:23:17

Leon, а стандартными средствами операционной системы примонтировать удаленный сетевой ресурс в качестве диска системы религия не позволяет? Это вообще-то единственный нормальный способ обращения к данным на сетевом диске, а вот то, что вы собирались сделать, к работе с файловой системой уже не соотносится - это чисто сетевой уровень, насколько помню при нем например нет файлов прямого доступа, только последовательно читаемые потоки.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 245

Рейтинг@Mail.ru