Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1106493261
mariya_mezenceva
2005-01-23 18:14
2005.02.06
код разделителя разрядов


1-1106322561
Zvrb
2005-01-21 18:49
2005.02.06
Как сделать программу регистрации на сайте


1-1106728540
akvilon
2005-01-26 11:35
2005.02.06
Дерево настроек


1-1106532893
zalfreid
2005-01-24 05:14
2005.02.06
Задача на оптимальное решение


4-1103264103
SiDoff
2004-12-17 09:15
2005.02.06
Запрет удаления в Win 98, pop up меню ....





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский