Форум: "Основная";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];
ВнизEXE, DLL и ShareMem Найти похожие ветки
← →
Mielofon (2005-01-24 09:01) [0]Добрый день.
Проблема у нас в следующем:
Есть EXE который собран без ShareMem. И есть DLL (плугин например) которую надо бы подключить к этому EXE и который имеет ShareMem.
Так вот если в EXE нет ShareMem-а, то в конструкции
h := LoadLibrary("d:\DLLka.DLL");
FreeLibrary(h);
падаем на FreeLibrary :-(
Что делать?
Неиспользовать ShareMem мы не можем. Хотя согласны, что можно использовать альтернативу ему (commm.pas, ShareMemRep.pas), но ничего хорошего не нашли.
Все таки:
1. Можно ли заставит работать связку EXE-БезShareMem + DLL-ShareMem?
← →
KSergey © (2005-01-24 09:14) [1]> Mielofon (24.01.05 09:01)
> Неиспользовать ShareMem мы не можем.
Вот это не очень понятное заявление.
От чего же?
А вообще, все различие использования/не использования ShareMem относится лишь к передаче/получению переменных типа String или других динамических объектов через интерфейсные функции.
Вот на них было бы любопытно взглянуть. Тогда можно сказать что-то определенное.
← →
Mielofon (2005-01-24 09:23) [2]>Вот это не очень понятное заявление.
>А вообще, все различие использования/не использования ShareMem >относится лишь к передаче/получению переменных типа String или >других динамических объектов через интерфейсные функции.
У нас 3 (основных, на самом деле больше) DLL на 10-ть Мег, >20 Мег кода.
И мы писали их под ShareMem.
Передача переменных типа String или динамических переменных это верхушка айсберга, которую мы готовы переписать.
А основная проблема в том, что мы передаем указатели на объекты и пользуемся ими (объектами) как своими - это скрытая часть айсберга. И все у нас работает при условии использовании ShareMem.
Это большой код и переписать его сейчас мы не в силах. :-(
← →
Юрий Зотов © (2005-01-24 09:28) [3]Так пропишите ShareMem в EXE-шнике, вот и все дела. Одна строчка, и переписывать ничего не придется.
← →
KSergey © (2005-01-24 09:30) [4]Да плевать сколько там у вас кода!
Интересуют интерфейсные функции между exe и dll
> [2] Mielofon (24.01.05 09:23)
> А основная проблема в том, что мы передаем указатели на
> объекты и пользуемся ими (объектами) как своими
Если память под объекты выделяется и освобождается в одном модуле - то не вижу проблемы
Если же это происходит в разных модулях - то бить за это надо.
Впрочем, не всегда это происходит явно, возможно.
← →
KSergey © (2005-01-24 09:32) [5]Да, я так понял, что "указатели на объекты" - это относится к взаимодействию dll
Есил же это относится и к exe - то иного пути нет вообще: либо ShareMem, либо менять архитектуру.
← →
jack128 © (2005-01-24 09:33) [6]Mielofon (24.01.05 9:23) [2]
И все у нас работает при условии использовании ShareMem.
Так и должно быть. Более того при передаче объектов очень желательно, хотя и не обязательно компилировать длл и ехе с run time пактами..
Mielofon (24.01.05 9:23) [2]
Это большой код и переписать его сейчас мы не в силах. :-(
Добавить в EXE uses ShareMem - это большой код??
← →
Digitman © (2005-01-24 09:39) [7]
> Это большой код и переписать его сейчас мы не в силах.
да что там переписывать-то ?
в dpr-файле хост-приложения просто добавить в uses первой позицией Sharemem - и всех делов !
> У нас 3 (основных, на самом деле больше) DLL на 10-ть Мег,
> >20 Мег кода.
> И мы писали их под ShareMem.
и незачем было так извращаться.
если все проекты собраны с ран-тайм пакетами, никаких Sharemem вовсе не требуется
а если проекты собирались , ч.н. "куда кривая вывезет" (т.е. какие-то проекты - с BwRTP, какие-то - без BwRTP), то надо было сразу делать это с полным пониманием - задействование единого менеджера памяти осуществляется двумя базовыми способами :
1. Сборка ВСЕХ проектов с BwRTP и безо всяких Sharemem - миним.размер генерируемого исп.кода, но зависимость от bpl
2. Сборка ВСЕХ проектов с Sharemem без BwRTP - избыточность генерируемого исп.кода, зависимость от модуля, реализующего менеджер памяти, но независимость от bpl
← →
REA (2005-01-24 09:40) [8]Есть вариант переделать DLL в Packages. Тогда необходимость в ShareMem вообще отпадет, а функциональность останется. Хотя возможно придется вынести общий код в отдельные Packages.
← →
Mielofon (2005-01-24 10:15) [9]А вот EXE не совсем наш :-( И поэтому вставить в него ShareMem мы не можем.
Одна DLL1 (c ShareMem) дергает функции из другой DLL2 (с ShareMem)
Функция возвращает например указательна объект, который создан в DLL1. А мы с ним работаем в DLL2 как с родным. Т.е. дергаем его методы и т.д. В процессе работы происходит перераспределение памяти. :-(
Самое то главное: если пишешь DLL и хочешь что бы ее могли использовать другое, то не пользуйся ShareMem-ом?
Я честно говоря думал, что если я не буду в EXE перераспределять память которая выделена в DLL, то моему EXE-шнику пофиг что там в DLL (ShareMem, не ShareMem). А практика показала, что не так :-(
Есть возможность сказать, что в DLL память своя и трогать ее из EXE ни к коем случае не надо?
← →
jack128 © (2005-01-24 10:25) [10]Mielofon (24.01.05 10:15) [9]
А вот EXE не совсем наш :-( И поэтому вставить в него ShareMem мы не можем.
Тогда этоо проблемы разработчиков EXE. Требовать в качестве параметров объекты и при этом не использовать ШареМм
Mielofon (24.01.05 10:15) [9]
Функция возвращает например указательна объект, который создан в DLL1. А мы с ним работаем в DLL2 как с родным. Т.е. дергаем его методы и т.д. В процессе работы происходит перераспределение памяти. :-( Ну и что?? Если d используешь ShareMem, то этот не страшно.
Mielofon (24.01.05 10:15) [9]
и хочешь что бы ее могли использовать другое, то не пользуйся ShareMem-ом?
ShareMem must be the
first unit in your library"s USES clause AND your project"s (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. Тоже касается объектов, дин массивов и тд. Если ничего этого нету, то и ShareMem не нужен.
Mielofon (24.01.05 10:15) [9]
Есть возможность сказать, что в DLL память своя и трогать ее из EXE ни к коем случае не надо?
У DDL и EXE общее адресное пространство, поэтому если EXE"шник захочет, он всегда сможет писать в память выделенную в DLL
← →
Mielofon (2005-01-24 10:32) [11]
> Mielofon (24.01.05 10:15) [9]
> А вот EXE не совсем наш :-( И поэтому вставить в него ShareMem
> мы не можем.
>
> Тогда этоо проблемы разработчиков EXE. Требовать в качестве
> параметров объекты и при этом не использовать ШареМм
EXE ничего не требует.
Если в нем просто делается LoadLibrary и сразу за ним FreeLibrary, то это уже повод что бы упасть при FreeLibrary. :-(
Никто ничего из EXE не успевает дернуть..
Объекты в качестве параметров используются при общениии между 2-мя нашими DLL-ками (в обоих ShareMem включен).
> Есть возможность сказать, что в DLL память своя и трогать
> ее из EXE ни к коем случае не надо?
> У DDL и EXE общее адресное пространство, поэтому если EXE"шник
> захочет, он всегда сможет писать в память выделенную в DLL
Никто ничего не пишет :-(
Падение уже просто при LoadLibrary, FreeLibrary.
Хотя я как раз думал, что если я не буду трогать память выделеную в DLL, то и проблем не будет - оказалось я не прав :-(
← →
REA (2005-01-24 10:54) [12]Попробуй совет [7] - собрать все DLL с rtl. Заодно и места поменьше будут занимать.
← →
KSergey © (2005-01-24 11:15) [13]> Падение уже просто при LoadLibrary, FreeLibrary.
А если честно - вообще есть уверенность, что dll написаны корректно? ;)
← →
Digitman © (2005-01-24 11:32) [14]
> Падение уже просто при LoadLibrary, FreeLibrary
и это - ОДНОЗНАЧНО проблема разработчика той ДЛЛ, которую пытаются загрузить/выгрузить. Т.е. твоя проблема.
← →
Mielofon (2005-01-24 11:42) [15]
> и это - ОДНОЗНАЧНО проблема разработчика той ДЛЛ, которую
> пытаются загрузить/выгрузить. Т.е. твоя проблема.
Был бы я тут если бы проблем не было :-(
program Project1;
uses
SysUtils,
Windows;
var
h: THandle;
begin
{ TODO -oUser -cConsole Main : Insert code here }
h := LoadLibrary("TestDll1.dll");
FreeLibrary(h);
end.
//
library TestDll1;
uses
ShareMem,
SysUtils,
Classes;
{$R *.res}
begin
end.
падает на FreeLibrary(h);
Т.е. получается, что DLL с ShareMem можно приципить только к EXE с Sharemem? Никак это обойти нельзя?
Попытались воспользоваться Commm.pas (http://members.chello.nl/t.koning8/commm.pas)
purpose: Simple COM based memory manager replacement, tested for Delphi 4-7
Под Delphi падает при выходе :-(
Хотя если просто запускаем, то выходит без шума.
← →
Mielofon (2005-01-24 11:44) [16]
> А если честно - вообще есть уверенность, что dll написаны
> корректно? ;)
Что значит корректно?
То что связка EXE-Sharemem (2штуки) + RTS-Sharemem (3 основных, + дополнительные пользователи пишут) работает, можно считать, что "dll написаны корректно?"
← →
Digitman © (2005-01-24 11:56) [17]
> Mielofon (24.01.05 11:42) [15]
еще раз - проблема у тебя в коде самой ДЛЛ, а не в коде, который ее грузит и тут же выгружает ! И Sharemem либо его отсутствие здесь абсолютно ни при чем.
← →
Mielofon (2005-01-24 12:05) [18]
> еще раз - проблема у тебя в коде самой ДЛЛ, а не в коде,
> который ее грузит и тут же выгружает ! И Sharemem либо его
> отсутствие здесь абсолютно ни при чем.
А я код привел. Где там ошибка? (именно вариант EXE без ShareMem, DLL с ShareMem)
← →
KSergey © (2005-01-24 12:09) [19]А если проверить чему вообще-то равно h? И нет ли в нем признака ошибки?
← →
REA (2005-01-24 12:17) [20]Да, в таком виде не должно глючить. Путь рекомендую указывать полный во избежание ошибок на клиентских машинах.
← →
Digitman © (2005-01-24 12:21) [21]
> падает на FreeLibrary(h)
и что значит "падает" ?
← →
Mielofon (2005-01-24 13:22) [22]
> А если проверить чему вообще-то равно h? И нет ли в нем
> признака ошибки?
Нормальный там хэндл.
> Да, в таком виде не должно глючить.
Ну вот у меня: XP, D7. И падает на FreeLibrary.
>Путь рекомендую указывать
> полный во избежание ошибок на клиентских машинах.
Это ж только пример - тут ничего не запускается :-)
> и что значит "падает" ?
http://RealMielofon.narod.ru/pics/Error1.JPG
память 0x0000000 не может быть read.
← →
KSergey © (2005-01-24 13:30) [23]А если в примере из
[15] Mielofon (24.01.05 11:42) хост-приложение сделать таким:
program Project1;
uses
SysUtils,
Windows;
var
h: THandle;
begin
{ TODO -oUser -cConsole Main : Insert code here }
h := LoadLibrary("TestDll1.dll");
if Integer(h) = 0 then
ShowMessage ("Фигня какая-то")
else
FreeLibrary(h);
end.
Что получится?
← →
Digitman © (2005-01-24 13:35) [24]
> http://RealMielofon.narod.ru/pics/Error1.JPG
да нахрен мне твои картинки разглядывать !
у меня что, траффик резиновый ?
ты что, не в состоянии привести ПОЛНЫЙ текст сообщения об исключении ?
вывод некоего мод.диал.окна ты считаешь "падением" ?!
← →
Mielofon (2005-01-24 14:42) [25]
> А если в примере из
> [15] Mielofon (24.01.05 11:42) хост-приложение сделать
> таким:
Те же яйца.
Я же говорю, что LoadLibrary проходит на ура. Падает на FreeLibrary
← →
Mielofon (2005-01-24 14:51) [26]
> да нахрен мне твои картинки разглядывать !
> у меня что, траффик резиновый ?
> ты что, не в состоянии привести ПОЛНЫЙ текст сообщения об
> исключении ?
не шуми..
Я почти все что написано уже написал.
Окошко значит такое:
В заголовке окна "Project1.exe - ошибка приложения."
В самом окошке:
"
Инструкция по адресу "0x00000000" обратилась по адресу "0x00000000". Память не может быть "read"
"OK" -- завершение приложения
"Отмена" -- отладка приложения
"
ну и соответственно 2 кнопки Ok и Отмена
> вывод некоего мод.диал.окна ты считаешь "падением" ?!
Что значит некоего? Если окошко не мое (а исходники я полностью опубликовал), и оно сообщает что приложение будет закрыто, то это ли ни есть падение?
← →
Digitman © (2005-01-24 15:07) [27]
> Mielofon (24.01.05 14:51) [26]
добавь sharemem в uses вызывающего dpr и не мучайся.
или поубирай все sharemem изо всех dpr и собирай все проекты с BwRTP
← →
Mielofon (2005-01-24 15:11) [28]От чего шли к тому и пришли :-(
Не мой это EXE. Не могу я в нем ShareMem поставить.
А в своей DLL слишком дорого убирать ShareMem.
Нескромный вопрос: что такое BwRTP?
← →
Digitman © (2005-01-24 15:25) [29]
> От чего шли к тому и пришли :-(
тотому что ты не слушаешь ни шиша что тебе говорят.
убедись что "не твой ЕХЕ" собран с ран-тайм пакетами
если так , то выкинь все шаромемы изо своих плагинов и засим успокойся - все будет работать как положено
если не так, то или выкинь этот ЕХЕ в мусор или бомби его разработчиков на предмет или пересборки ихнего ЕХЕ с ран-тайм пакетами или включения шаромема в их проект
← →
jack128 © (2005-01-24 19:13) [30]Mielofon
У мя твой тестовый проэкт работает абсолютно нормально.program Project1;
uses
SysUtils,
Windows;
var
h: THandle;
begin
try
h := LoadLibrary("TestDll1.dll");
Win32Check(h <> 0);
Win32Check(FreeLibrary(h));
except
on E: Exception do
MessageBox(0, PChar(E.ClassName+": "+ E.Message), nil, 0);
end;
end.
library TestDll1;
uses
ShareMem,
SysUtils,
Classes;
{$R *.RES}
begin
end.
← →
Mielofon (2005-01-25 17:51) [31]Как так?
Какая версия Delphi и Windows?
← →
jack128 © (2005-01-25 18:01) [32]Delphi5 UP1, Win2k SP3
← →
Mielofon (2005-01-25 18:13) [33]У меня D7, WinXP падает и не только у меня :-(
← →
jack128 © (2005-01-25 19:40) [34]Mielofon (25.01.05 18:13) [33]
"Использование Дельфи без, по крайней мере, двух апдейт паков считаю извращением"(с) почти Romkin ;-)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.048 c