Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.06;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.031 c
4-1103567201
_snake_
2004-12-20 21:26
2005.02.06
Разница между RS422 и RS232


1-1106561113
slim
2005-01-24 13:05
2005.02.06
помогите перевести на делфи


14-1105006705
Дмитрий В. Белькевич
2005-01-06 13:18
2005.02.06
Как преобразовать xml в html


1-1106217787
Алексей
2005-01-20 13:43
2005.02.06
Поиск в Memo


8-1098530146
ALEKCEY
2004-10-23 15:15
2005.02.06
Визуализации музыки и фракталы