Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Dll + ссылка на объект в вызывающей программе 
:(
    Опции темы
Вася К.
Дата 17.3.2006, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 9.2.2005

Репутация: нет
Всего: нет



Здраствуйте!

Можно ли при инициализации dll, в блоке begin ... end получить указатель на объект в вызывающей программе?

Спасибо!
--------------------
Да здраствует ОПТИМИЗМ!
PM MAIL YIM   Вверх
Демо
Дата 17.3.2006, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



В момент инициализации библиотеки она еще не имеет доступа к адресному пространству вызвавшего процесса. Мне так кажется.


--------------------
    
PM MAIL ICQ Skype   Вверх
_hunter
Дата 17.3.2006, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



а не проще ли этот указатель ей передать?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Демо
Дата 17.3.2006, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Цитата(_hunter @ 17.3.2006, 11:36 Найти цитируемый пост)
а не проще ли этот указатель ей передать?


Передать-то только после инициализации можно;)


--------------------
    
PM MAIL ICQ Skype   Вверх
_hunter
Дата 17.3.2006, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



ну и отлично.
в DllMain он всеравно нафик не нужен smile


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Alexeis
Дата 17.3.2006, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Можно попробовать так при инициализации dll, dll загрузит другую dll, которая просмотрит все процессы и проверит кто загрузил первую. Правда неизвестно будет ли первая считаться уже загруженной...


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Демо
Дата 17.3.2006, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Цитата(Вася К. @ 17.3.2006, 10:11 Найти цитируемый пост)
Можно ли при инициализации dll, в блоке begin ... end


Получить можно, но что это даст?


--------------------
    
PM MAIL ICQ Skype   Вверх
Alexeis
Дата 17.3.2006, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Вася К., лучше поведай в чем задача может есть альтернативные пути решения.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
bems
Дата 17.3.2006, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(Демо @ 17.3.2006, 10:23 Найти цитируемый пост)
В момент инициализации библиотеки она еще не имеет доступа к адресному пространству вызвавшего процесса. Мне так кажется.

имеет
Цитата(alexeis1 @ 17.3.2006, 12:14 Найти цитируемый пост)
Можно попробовать так при инициализации dll, dll загрузит другую dll, которая просмотрит все процессы и проверит кто загрузил первую. Правда неизвестно будет ли первая считаться уже загруженной...
проще уже файлмаппинг расшарить по имени. Или tls.

Это сообщение отредактировал(а) bems - 17.3.2006, 14:24


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Вася К.
Дата 17.3.2006, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 9.2.2005

Репутация: нет
Всего: нет



В Dll сидят некоторые процедуры для работы с базой Interbase. И в ней для работы сидит один глобальный IBQuery, IBTransaction , и чтобы не создовать лишний коннект к базе, я использую IBDatabase приложения. Сейчас я передаю указатель на IBDatabase после загрузки dll с помощью дополнительной процедуру. Вот подумал, может можно сразу назначить IBDatabase для IBQuery и т.д...
--------------------
Да здраствует ОПТИМИЗМ!
PM MAIL YIM   Вверх
bems
Дата 17.3.2006, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Ща пример налабаю...


--------------------
Обижено школьников: 8
PM MAIL   Вверх
bems
Дата 17.3.2006, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Код

unit SharedConsts;

interface
uses windows;
type pObj=^TObject;
const FMname='kjrvfvuthvu_tfjudmwskxc8548655__934jd8fddjslk_zsdm94v4kre';
      FMSize=64*1024;
      shdObject=0;shdAnotherSharedData=4;//и тд если надо
var h:THANDLE;view:pointer;

function GetSharedData(offset:DWORD):pointer;

implementation

function GetSharedData(offset:DWORD):pointer;
begin
result:=pointer(DWORD(view)+offset)
end;

end.



Код

program prog;
uses
  windows,SharedConsts;
var lib:THANDLE;
    YourCoolObject:TObject;
begin
YourCoolObject:=TObject.Create;
h:=CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,0,FMSize,FMname);
view:=MapViewOfFile(h,FILE_MAP_WRITE,0,0,FMSize);
if assigned(view) then pObj(GetSharedData(shdObject))^:=YourCoolObject;
lib:=LoadLibrary('lib.dll');
UnmapViewOfFile(view);
CloseHandle(h);
if lib=0 then MessageBox(0,'!',nil,0)
         else begin
              //используешь библиотеку
              FreeLibrary(lib);
              YourCoolObject.Free;
              end;
end.


Код

library lib;
uses windows,SharedConsts;
var SomeExternalObject:TObject;   s:string;
begin
view:=nil;
h:=OpenFileMapping(FILE_MAP_WRITE,false,FMname);
view:=MapViewOfFile(h,FILE_MAP_WRITE,0,0,FMSize);
ExitCode:=integer(not assigned(view));
if not boolean(ExitCode) then begin
                              SomeExternalObject:=PObj(GetSharedData(shdObject))^;
                              UnmapViewOfFile(view);
                              CloseHandle(h);

                              s:=SomeExternalObject.ClassName;             //тут используешь
                              MessageBox(0,PChar(s),'Класс объекта',MB_OK);//свой объект
                              end;
end.



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Girder
Дата 17.3.2006, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Код
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var h:DWord;
    s:array [0..10] of Char;
    i:DWord;
begin
 asm
  mov i,esp
 end;
 i:=i-$2000;
 PDWord(i)^:=DWord(@s);
 PDWord(i-4)^:=$33771122;
 PDWord(i-8)^:=$11221122;
 FillChar(s,SizeOf(s),#0);
 h:=LoadLibrary('mDLL.dll');
 if h<>0 then
  begin
   caption:=PChar(@s);
   FreeLibrary(h);
  end;
end;

end.


Код

library mDLL;

uses
  Windows;

var i:PDWord;
    p:PAnsiChar;

begin
 asm
  mov i,esp
 end;
 try
  repeat
   while (i^<>$33771122) do dec(i);
   dec(i);
  until (i^=$11221122);
  inc(i);inc(i);
  p:=Pointer(i^);
  p^:='Г';
  inc(p);
  p^:='ы';
  inc(p);
  p^:=#0;
 finally
  //Не вышло :)
 end;
end.


PS: smile


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
bems
Дата 17.3.2006, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Girder, ась?

Нет, серьезно, поподробнее?

особенно про это
Цитата(Girder @ 17.3.2006, 18:33 Найти цитируемый пост)
asm
  mov i,esp
end;
i:=i-$2000;
PDWord(i)^:=DWord(@s);
PDWord(i-4)^:=$33771122;
PDWord(i-8)^:=$11221122;


и это

Цитата(Girder @ 17.3.2006, 18:33 Найти цитируемый пост)
  repeat
  while (i^<>$33771122) do dec(i);
  dec(i);
  until (i^=$11221122);
  inc(i);inc(i);
  p:=Pointer(i^);
  p^:='Г';
  inc(p);
  p^:='ы';
  inc(p);
  p^:=#0;



M
Girder
А что тут объяснять?
Проще только 2+2 :) !



--------------------
Обижено школьников: 8
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0599 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.