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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вызов функции из dll 
V
    Опции темы
gonzales
Дата 7.4.2007, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Братцы, поможите, кто сталкивался.
Создаю библу, в которой инициализирую объект TJvHidDeviceController.

Код

type
 HC = class(TJvHidDeviceController)
  function H_Enumerate(HidDev: TJvHidDevice; const Idx: Integer): Boolean;
  procedure H_HidCtlDeviceChange(Sender: TObject);
end;

var
h: HC;

procedure PInit;

procedure HC.H_HidCtlDeviceChange(Sender: TObject);
begin
showmessage('device_change');
h.Enumerate;
end;

function HC.H_Enumerate(HidDev: TJvHidDevice; const Idx: Integer): Boolean;
begin
 showmessage(HidDev.ProductName);
 Result := True;
end;


procedure PInit;
begin
 h:=HC.Create(h);
 h.OnEnumerate:=h.H_Enumerate;
 h.OnDeviceChange:=h.H_HidCtlDeviceChange;
 h.DeviceChange;
end;

exports
 PInit;



подгружаю библиотеку, запускаю процедуру Init, но по неизвестной мне причине DeviceChange не срабатывает, я не получаю сообщения.

При использовании этого же кода без библиотеки, все работает на ура. В чем причина, помогите!!!!!!!!

листинг юнита без библы
Код

unit Unit1;

interface

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

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

type
 HC = class(TJvHidDeviceController)
  function H_Enumerate(HidDev: TJvHidDevice; const Idx: Integer): Boolean;
  procedure H_HidCtlDeviceChange(Sender: TObject);
end;



var
  Form1: TForm1;
  h: HC;

implementation

procedure HC.H_HidCtlDeviceChange(Sender: TObject);
begin
showmessage('device_change');
h.Enumerate;
end;

function HC.H_Enumerate(HidDev: TJvHidDevice; const Idx: Integer): Boolean;
begin
 showmessage(HidDev.ProductName);
 Result := True;
end;

procedure PInit;
begin
 h:=HC.Create(h);
 h.OnEnumerate:=h.H_Enumerate;
 h.OnDeviceChange:=h.H_HidCtlDeviceChange;
 h.DeviceChange;
end;


{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
PInit;
end;

end.

--------------------
- мастер, мастер, запорол..., все четыре запорол!!!- я ж тебе только три давал!!!???- да я и образец запорол!!!!
PM MAIL   Вверх
Alexeis
Дата 7.4.2007, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата(gonzales @  7.4.2007,  12:37 Найти цитируемый пост)
подгружаю библиотеку, запускаю процедуру Init, но по неизвестной мне причине DeviceChange не срабатывает, я не получаю сообщения.

  Передача объектов в Dll запрещена. Это приводит к неопределенным ситуациям. В чем причина, можно найти если захотеть, но лучше просто отказаться от такой передачи... Просто нельзя с все. Только COM или интерфейсы. 


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

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

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


Бывалый
*


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

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



так я ничего никуда не передаю. Объект создается в библиотеке и там же умирает... . Я такие штуки уже проделывал несколько раз, и все прекрасно работает. Все что я хочу, это грубо, чтобы объект передал из dll в основную программу через строковую переменную параметр.

Это сообщение отредактировал(а) gonzales - 7.4.2007, 13:05
--------------------
- мастер, мастер, запорол..., все четыре запорол!!!- я ж тебе только три давал!!!???- да я и образец запорол!!!!
PM MAIL   Вверх
Alexeis
Дата 7.4.2007, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Кто предок TJvHidDeviceController? Возможно, ему для работы нужен родитель. Это оконный компонент?


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

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

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


Бывалый
*


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

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



вот например аналогичный пример, в котором все работает
Код

type
 TCS = class(TClientSocket)
  procedure cs_Connect(Sender: TObject; Socket: TCustomWinSocket);
end;

var
cs: TCS;

procedure TCS.cs_Connect(Sender: TObject; Socket: TCustomWinSocket);
begin
cardlist.Add('WinLirc client');
end;


procedure PInit;
begin
 cs:=TCS.Create(cs);
 cs.Active:=false;
 cs.ClientType:=ctNonBlocking;
 cs.Host:='localhost';
 cs.Port:=8765;

 cs.OnConnect:=cs.cs_Connect;

export PInit;



Добавлено через 2 минуты и 23 секунды
Цитата

Кто предок TJvHidDeviceController? Возможно, ему для работы нужен родитель. Это оконный компонент?


нет это не оконный компонент, да и свойства parent у него нет
--------------------
- мастер, мастер, запорол..., все четыре запорол!!!- я ж тебе только три давал!!!???- да я и образец запорол!!!!
PM MAIL   Вверх
cat512
Дата 7.4.2007, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Alexeis @ 7.4.2007,  12:57)
Цитата(gonzales @  7.4.2007,  12:37 Найти цитируемый пост)
подгружаю библиотеку, запускаю процедуру Init, но по неизвестной мне причине DeviceChange не срабатывает, я не получаю сообщения.

  Передача объектов в Dll запрещена. Это приводит к неопределенным ситуациям. В чем причина, можно найти если захотеть, но лучше просто отказаться от такой передачи... Просто нельзя с все. Только COM или интерфейсы.

Ничего не запрещено!!!
Если всё грамотно сделать то всё будет работать!!!

Добавлено через 5 минут и 18 секунд
Как ты подгружаеш библиотеку?
PM MAIL   Вверх
Alexeis
Дата 7.4.2007, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата(cat512 @  7.4.2007,  14:48 Найти цитируемый пост)
Ничего не запрещено!!!
Если всё грамотно сделать то всё будет работать!!!

  Если сильно постараться и связать объект со всеми необходимыми ему глобальными объектами типа Application, менеджером динамической памяти, разрулить все особенности связанные с RTTI, то может оно и будет нормально работать, но все это недокументированные методы, которые нежелательно использовать из-за плохой переносимости. Потому не нужно учить плохому участников. Если где-то и работает, то это скорее исключение, чем правило. Читайте документацию от борланда. Покажите, где там написано, что можно передавать обычные объекты из Dll.


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

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

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


Бывалый
*


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

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



Цитата(Alexeis @  7.4.2007,  16:29 Найти цитируемый пост)
Если сильно постараться и связать объект со всеми необходимыми ему глобальными объектами типа Application, менеджером динамической памяти, разрулить все особенности связанные с RTTI, то может оно и будет нормально работать, но все это недокументированные методы, которые нежелательно использовать из-за плохой переносимости. Потому не нужно учить плохому участников. Если где-то и работает, то это скорее исключение, чем правило. Читайте документацию от борланда. Покажите, где там написано, что можно передавать обычные объекты из Dll.


да где вы увидели перенос объекта из библиотеки. Более того, я таким образов даже с сишной библиотекой общался, в которой создан был экземпляр класса, а в основную програму на делфи передавались только результаты ее работы. См пример, с TSocet.


Цитата

Как ты подгружаеш библиотеку?

динамически. 
--------------------
- мастер, мастер, запорол..., все четыре запорол!!!- я ж тебе только три давал!!!???- да я и образец запорол!!!!
PM MAIL   Вверх
cat512
Дата 7.4.2007, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Запости код подгрузки библиотеки, я думаю у тебя там ошибка

PM MAIL   Вверх
cat512
Дата 7.4.2007, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Alexeis @ 7.4.2007,  16:29)
Цитата(cat512 @  7.4.2007,  14:48 Найти цитируемый пост)
Ничего не запрещено!!!
Если всё грамотно сделать то всё будет работать!!!

  Если сильно постараться и связать объект со всеми необходимыми ему глобальными объектами типа Application, менеджером динамической памяти, разрулить все особенности связанные с RTTI, то может оно и будет нормально работать, но все это недокументированные методы, которые нежелательно использовать из-за плохой переносимости. Потому не нужно учить плохому участников. Если где-то и работает, то это скорее исключение, чем правило. Читайте документацию от борланда. Покажите, где там написано, что можно передавать обычные объекты из Dll.

во первых:
в приведённом коде нет работы с  глобальных объектов дельфы, а следовательно не надо ничего связывать и разруливать а тем более юзать RttI.
Во вторых:
как обращаются к объектам дельфы ? С помощью объектных ссылок( к классам с помщью классовых ссылок) Так вот обьектная ссыла - это указатель на блок памяти распределённой менеджером памяти под  некоторый объект. Поэтому не вижу каких либо проблем с передачей объектной ссылки в Dll или наоборот. Это можно сделать например с помощью экспортируемой функции основного приложения, которая возвращает объектную ссылку. В Dll получаеш HModule( хэндел основного приложения ) с помощью GetModuleHandle() и подтягиваеш адрес экспортируемой функции которая возвратит тебе объектную ссылку, с пом. фун. GetProcAddress(). Так что не вижу в этом ничего плохого  и недокументированного. А по поводу "Покажите, где там написано, что можно передавать обычные объекты из Dll" могу сказать только одно ("железная логика")  если не написанно это не значит что так делать нельзя. В дельфовском хелпе многое чего не написанно и многое что следовало бы описать. И участников форрума я не учу плохому, я просто опроверг ваше высказывание о том что передавать объекты в Dll или из Dll запрещено!!! Кем запрещено?
PM MAIL   Вверх
gonzales
Дата 7.4.2007, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

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

     Init : procedure; stdcall;
      handle :HMODULE;

    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 handle :=  LoadLibrary('hid.dll');
  if handle <> 0 then
   begin
    @Init := GetProcAddress(handle,'PInit');


    if @Init <> nil then
     Init;
   end;

end;

end.




Это сообщение отредактировал(а) gonzales - 7.4.2007, 19:28
--------------------
- мастер, мастер, запорол..., все четыре запорол!!!- я ж тебе только три давал!!!???- да я и образец запорол!!!!
PM MAIL   Вверх
gonzales
Дата 7.4.2007, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



мляяяя, нашел ощибку!!!
есть еще системная библиотека hid.dll. Она и перекрывала вызов процедуры.
Вопрос можно закрывать, все работает, всем спасибо.
--------------------
- мастер, мастер, запорол..., все четыре запорол!!!- я ж тебе только три давал!!!???- да я и образец запорол!!!!
PM MAIL   Вверх
Alexeis
Дата 7.4.2007, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата(cat512 @  7.4.2007,  18:53 Найти цитируемый пост)
во первых:
в приведённом коде нет работы с  глобальных объектов дельфы, а следовательно не надо ничего связывать и разруливать а тем более юзать RttI.

  То что писал не имело прямого отношения к данному случаю. Тема уже не раз обсуждалась, потому я даже не хочу тут обсуждать эту ересь. Если охота доказывать, что это можно поищите по форуму нужную тему.


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

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

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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