Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 28 • Страница 1 из 21  2  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 01.10.2003
Откуда: Тюмень
в общем проблемка.
есть компонент, в который загружается некая структура. для некоторых последующих операций с этой структурой используется некое подобие лиспа.

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

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

мож есть какие ключики компилятору или опции какие.
потому как думаю изза памяти все это.

да и глюк дурной - Invalid class typecast

кому интересно можно и поподробнее.



Партнер
 

Member
Статус: Не в сети
Регистрация: 15.04.2004
Откуда: Москва
Давай подробнее.
Проблемы могу быть -
1. Разное значение прагмы ALIGN
2. Проблемы с менеджером памяти (каждый модуль использует свой менеджер)
3. Импортированные из dll функции не помечены как stdcall
4. Класс, которые тебе возвращается не наследник и не предок того, к которому ты приводишь.

_________________
Цель жизни - d20 по жизни...


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
Выход один. не передавать никакие компоненты, а только структуры данных


 

Member
Статус: Не в сети
Регистрация: 01.10.2003
Откуда: Тюмень
ща будет подробнее.

во первых dll используется не как обычно. не для "расшаривания функций".
в dll прописано только 2 функции
InitPlugIn, - собственно то, что интересует.
GetInfo; - просто инфа типа версии

procedure InitPlugIn(const FLogger: TLogger); Logger - тот самый компонент
begin
Application.CreateForm(TMain, Main);
Main.SetParams(FLogger);
Main.ShowModal;
end;
----------------
тута идет обработка постоянно поступающих в структуру данных. чтото типа лиспа
if Assigned (FHandler) then begin
PriorValue := FValue;
N := FHandler.Evaluate; обработать, если есть чем.
try
FValue := (N as TNumericNode).AsFloat; - вот тут и вылетает Invalid class typecast

а это если нет обработчика
else if Assigned (Sensor) then
begin
PriorValue := FValue;
FValue := FSensor.Value; - это работает в любом случае

еще раз скажу что если структура была загружена в компонент до передачи его в dll, то все нормально.
если сначала передать компонент, и только потом подгрузить в него структуру, то вылетит.




а делал через dll чтоб была модульность.
слишком много писать придется чтоб объяснить зачем :)

_________________
Когда ты закрываешь глаза, то видишь пустоту. Она без движения и спрятана в черный цвет.


 

Member
Статус: Не в сети
Регистрация: 15.04.2004
Откуда: Москва
_Alex_
Ню-ню...
Цитата:
еще раз скажу что если структура была загружена в компонент до передачи его в dll, то все нормально.

const FLogger: TLogger - и слово const говорит о том, что FLogger не будет изменятся.
Убирай const и все ок.

_________________
Цель жизни - d20 по жизни...


 

Member
Статус: Не в сети
Регистрация: 01.10.2003
Откуда: Тюмень
Logger - это просто компонент для передачи данных. но все равно попробую.

в таком случае почему это прокатывает?
>а это если нет обработчика
>else if Assigned (Sensor) then
>begin
>PriorValue := FValue;
>FValue := FSensor.Value; - это работает в любом случае

в ЛЮБОМ случае. была или не была загружена структура в компонент до его передачи в dll

_________________
Когда ты закрываешь глаза, то видишь пустоту. Она без движения и спрятана в черный цвет.


 

Member
Статус: Не в сети
Регистрация: 15.04.2004
Откуда: Москва
_Alex_
Вопрос на вопрос: А что такое Value и FSensor?
Ты либо описывай структуры (хотябы так TSensor = class...end) либо коменнтируй.

_________________
Цель жизни - d20 по жизни...


 

Member
Статус: Не в сети
Регистрация: 01.10.2003
Откуда: Тюмень
согласен. тороплюсь малость

полностью описывать смысла мало. да и много там всего.

в общем есть прибор. он регистрирует различные данные и сыпет на СОМ порт.
Logger - чтото типа менеджера этого прибора. управление и обработка данных.
прибор можно представить как набор "датчиков" и "каналов".

так вот.
Канал - это обработка показаний датчика. у каждого канала есть датчик.

терь немного повторюсть.
procedure TLoggerChannel.Update; - обновление показаний канала.
var
PriorValue: Double;
N: TNode;
begin
if Assigned (FHandler) then begin - если есть обработчик (в FHandler формула для пересчета, например к*х+в где х-значение датчика),

PriorValue := FValue;
N := FHandler.Evaluate; - то пересчитываем значение по заданной там формуле
try
FValue := (N as TNumericNode).AsFloat; - FValue - показания канала
end;
finally
N.Free;
end;
end
else if Assigned (Sensor) then - если нет обработчика,
begin
PriorValue := FValue;
FValue := FSensor.Value; - то просто забираем значение датчика
end;

OnChange (Self); - кидаем событие
end;

так вот.
FValue := FSensor.Value; работает всегда,
а FValue := (N as TNumericNode).AsFloat; - как уже писал :)


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

такая вот муть. :)
видимо придтся делать без dll. просто выйдет довольно неудобная прога. все подряд в нее пихать :)

_________________
Когда ты закрываешь глаза, то видишь пустоту. Она без движения и спрятана в черный цвет.


 

Member
Статус: Не в сети
Регистрация: 15.04.2004
Откуда: Москва
_Alex_
Проверяй, что тебе возвращает Evaluate.
Если nil, то он естественно не откастится.
Все скаляры преобразуются как TNumericNode(N) а не кастом через as
И скорее всего, проблема в const.
Но идеальнее всего гонять класся как Longint (и приводить к нужному типу).
И опять же, проверь наличие/отсутствие юнита sharemem - это разделение менеджера памяти.

_________________
Цель жизни - d20 по жизни...


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
По любому
Цитата:
procedure InitPlugIn(const FLogger: TLogger);

Не правильное описание. Без const используй. И не забудь в dll приписать в раздел use boralndmm


 

Member
Статус: Не в сети
Регистрация: 01.10.2003
Откуда: Тюмень
ну точно могу сказать что const тут ни при чем. как бы это не звучало :)

если не ошибаюсь галочка рядом с Assignable typed constants. ну так надо.
sharemem нарисовал в главном приложении - ничего не изменилось. мож еще куда надо? но попробовал все варианты :)

>Проверяй, что тебе возвращает Evaluate.
>Если nil, то он естественно не откастится.
не nil. но не кастится

>И не забудь в dll приписать в раздел use boralndmm
не догнал. вроде как boralndmm.dll требует если Sharemem заюзать. или ошибаюсь

_________________
Когда ты закрываешь глаза, то видишь пустоту. Она без движения и спрятана в черный цвет.


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
Цитата:
не догнал. вроде как boralndmm.dll требует если Sharemem заюзать. или ошибаюсь

Ой точно, по памяти писал :)


 

Member
Статус: Не в сети
Регистрация: 07.04.2004
Откуда: Планета Земля
Есть Dll
Код:
 
library xxx;

function Convert:string;
var
  sss:string;
begin
  ...
  ...
  ...
  result:=sss;
end;

exports
  convert [b]name [/b]'Convert';

begin
end.




В проге
Код:
function Convert:string;external 'xxx.dll' name 'Convert';


при использовании в программе функции Convert возращается пустая строка - ПОЧЕМУ. :weep::weep::weep:
//в dll 100% возвращается не пустая строка

_________________
Keyboard not found, press F1 to continue...
Press any key to continue, or another to exit...


 

Member
Статус: Не в сети
Регистрация: 12.10.2004
Откуда: Paris, France
web-dav
Uses sharemem
и все будет ок

_________________
скажем НЕТ деградации!


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
web-dav Крайне не желательно испоьзовать string в .dll, PChar можно. Но если уж приходится то как и писал Makoed , надо добавлять sharemem. Вообщето об этом написано английским по белому в хелпе :)


 

Member
Статус: Не в сети
Регистрация: 07.04.2004
Откуда: Планета Земля
что такое sharemem и с чем его едят...

_________________
Keyboard not found, press F1 to continue...
Press any key to continue, or another to exit...


 

Member
Статус: Не в сети
Регистрация: 12.10.2004
Откуда: Paris, France
web-dav
Это такой модуль, который позврляет без проблем передавать строки из external функций, и вообще мой тебе совет: почитай MSDN-July-2004, говорят помогает...

_________________
скажем НЕТ деградации!


 

Member
Статус: Не в сети
Регистрация: 30.01.2003
Откуда: Москва
А еще можно пользоваться ShortString-ом (это, кстати, тоже в хелпе написано)

_________________
#77


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
web-dav Используй PChar. Не будет ниаких проблем с совместимостью. Полученный .dll будет пахать с программолй написанной на любом языке программирования.

Вот тебе пример.
Код:
library test;
uses SysUtils;
{$R *.res}
procedure ChangeString(str:PChar);stdcall;
begin
     StrCat(str,' added from dll');
end;

exports ChangeString name 'ChangeString';

begin

end.

И прем использования этого .dll
Код:
unit dlltest;

interface

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

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

var
  Form1: TForm1;
procedure ChangeString(str:PChar);stdcall;
implementation
procedure ChangeString(str:PChar);external 'test.dll'
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var str:PChar;
begin
     getmem(str,1000);
     StrPCopy(str,edit1.Text);
     ChangeString(str);
     Edit2.Text:=StrPas(str);
     freemem(str,1000);
end;

end.


 

Member
Статус: Не в сети
Регистрация: 07.04.2004
Откуда: Планета Земля
Ray Adams
Thanks попробую

_________________
Keyboard not found, press F1 to continue...
Press any key to continue, or another to exit...


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 28 • Страница 1 из 21  2  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan