![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
EXE, DLL и ShareMem [D7, Win95/98, WinME, NT4, Win2k, WinXP]
Mielofon © (2005-01-24 09:01:00)Добрый день.
Проблема у нас в следующем:
Есть 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?
jack128 (2005-01-25 19:40:00) [1]Mielofon (25.01.05 18:13) [33]
"Использование Дельфи без, по крайней мере, двух апдейт паков считаю извращением"(с) почти Romkin ;-)
Mielofon (2005-01-25 18:13:00) [2]У меня D7, WinXP падает и не только у меня :-(
jack128 (2005-01-25 18:01:00) [3]Delphi5 UP1, Win2k SP3
Mielofon (2005-01-25 17:51:00) [4]Как так?
Какая версия Delphi и Windows?
jack128 (2005-01-24 19:13:00) [5]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.
Digitman (2005-01-24 15:25:00) [6]
> От чего шли к тому и пришли :-(
тотому что ты не слушаешь ни шиша что тебе говорят.
убедись что "не твой ЕХЕ" собран с ран-тайм пакетами
если так , то выкинь все шаромемы изо своих плагинов и засим успокойся - все будет работать как положено
если не так, то или выкинь этот ЕХЕ в мусор или бомби его разработчиков на предмет или пересборки ихнего ЕХЕ с ран-тайм пакетами или включения шаромема в их проект
Mielofon (2005-01-24 15:11:00) [7]От чего шли к тому и пришли :-(
Не мой это EXE. Не могу я в нем ShareMem поставить.
А в своей DLL слишком дорого убирать ShareMem.
Нескромный вопрос: что такое BwRTP?
Digitman (2005-01-24 15:07:00) [8]
> Mielofon (24.01.05 14:51) [26]
добавь sharemem в uses вызывающего dpr и не мучайся.
или поубирай все sharemem изо всех dpr и собирай все проекты с BwRTP
Mielofon (2005-01-24 14:51:00) [9]
> да нахрен мне твои картинки разглядывать !
> у меня что, траффик резиновый ?
> ты что, не в состоянии привести ПОЛНЫЙ текст сообщения об
> исключении ?
не шуми..
Я почти все что написано уже написал.
Окошко значит такое:
В заголовке окна "Project1.exe - ошибка приложения."
В самом окошке:
"
Инструкция по адресу "0x00000000" обратилась по адресу "0x00000000". Память не может быть "read"
"OK" -- завершение приложения
"Отмена" -- отладка приложения
"
ну и соответственно 2 кнопки Ok и Отмена
> вывод некоего мод.диал.окна ты считаешь "падением" ?!
Что значит некоего? Если окошко не мое (а исходники я полностью опубликовал), и оно сообщает что приложение будет закрыто, то это ли ни есть падение?
Mielofon (2005-01-24 14:42:00) [10]
> А если в примере из
> [15] Mielofon (24.01.05 11:42) хост-приложение сделать
> таким:
Те же яйца.
Я же говорю, что LoadLibrary проходит на ура. Падает на FreeLibrary
Digitman (2005-01-24 13:35:00) [11]
> http://RealMielofon.narod.ru/pics/Error1.JPG
да нахрен мне твои картинки разглядывать !
у меня что, траффик резиновый ?
ты что, не в состоянии привести ПОЛНЫЙ текст сообщения об исключении ?
вывод некоего мод.диал.окна ты считаешь "падением" ?!
KSergey (2005-01-24 13:30:00) [12]А если в примере из
[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.
Что получится?
Mielofon (2005-01-24 13:22:00) [13]
> А если проверить чему вообще-то равно h? И нет ли в нем
> признака ошибки?
Нормальный там хэндл.
> Да, в таком виде не должно глючить.
Ну вот у меня: XP, D7. И падает на FreeLibrary.
>Путь рекомендую указывать
> полный во избежание ошибок на клиентских машинах.
Это ж только пример - тут ничего не запускается :-)
> и что значит "падает" ?
http://RealMielofon.narod.ru/pics/Error1.JPG
память 0x0000000 не может быть read.
Digitman (2005-01-24 12:21:00) [14]
> падает на FreeLibrary(h)
и что значит "падает" ?
REA (2005-01-24 12:17:00) [15]Да, в таком виде не должно глючить. Путь рекомендую указывать полный во избежание ошибок на клиентских машинах.
KSergey (2005-01-24 12:09:00) [16]А если проверить чему вообще-то равно h? И нет ли в нем признака ошибки?
Mielofon (2005-01-24 12:05:00) [17]
> еще раз - проблема у тебя в коде самой ДЛЛ, а не в коде,
> который ее грузит и тут же выгружает ! И Sharemem либо его
> отсутствие здесь абсолютно ни при чем.
А я код привел. Где там ошибка? (именно вариант EXE без ShareMem, DLL с ShareMem)
Digitman (2005-01-24 11:56:00) [18]
> Mielofon (24.01.05 11:42) [15]
еще раз - проблема у тебя в коде самой ДЛЛ, а не в коде, который ее грузит и тут же выгружает ! И Sharemem либо его отсутствие здесь абсолютно ни при чем.
Mielofon (2005-01-24 11:44:00) [19]
> А если честно - вообще есть уверенность, что dll написаны
> корректно? ;)
Что значит корректно?
То что связка EXE-Sharemem (2штуки) + RTS-Sharemem (3 основных, + дополнительные пользователи пишут) работает, можно считать, что "dll написаны корректно?"
Mielofon (2005-01-24 11:42:00) [20]
> и это - ОДНОЗНАЧНО проблема разработчика той ДЛЛ, которую
> пытаются загрузить/выгрузить. Т.е. твоя проблема.
Был бы я тут если бы проблем не было :-(
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 падает при выходе :-(
Хотя если просто запускаем, то выходит без шума.