Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» как заставить функции Длл видеть функции иного файла?

Автор: linker11
Дата сообщения: 11.10.2005 12:39
Трабла такой :проблема такая . при создании длл , в коде есть функции которые находяться в другом юните . в этой длл я их использую вот пример :

uses
SysUtils,
Classes,
CPDReg in '..\..\Mycomponent\MyLIb\Mylib\COMdrv32from inet\CPDReg.pas',
CPDrv in '..\..\Mycomponent\MyLIb\Mylib\COMdrv32from inet\CPDrv.pas';
var

Pink:word;
Massarray:array [1..30] of byte;
Count:real;
comm321: TCommPortDriver;
{$R *.res}

function StartCom(mn:integer):integer; export;
begin
count:=0;
comm321.connect;
if (mn=1) and (comm321.connect=true )then
begin
comm321.Connect;
StartCom:=1 end
else
StartCom:=0;
end;

function B(kl:integer):integer;export;
begin
B:=kl*kl;
end;

exports
startcom name 'ty',
B name 'ert ';

begin
end.

те comm321.connect это процедура из файла CPDrv.pas
при попытке орбаиться к StartCom функции из другой среды разработки (Лабвью-это гемор для разработки АСУ) посылает и говорит что внутренняя ошибка кода длл.
при чем B работает испрвано .
ПОМОГИТЕ !!
Автор: vserd
Дата сообщения: 11.10.2005 13:19
linker11

Цитата:
function StartCom(mn:integer):integer; export;

stdcall; наверное авторской правкой вырезано?
Читай доку по соглашениям о вызовах.
Автор: linker11
Дата сообщения: 11.10.2005 14:45
а где ее взять?
stdcall пробовал..но ошибка все равно есть.


Добавлено:
а где ее взять?
stdcall пробовал..но ошибка все равно есть.
Автор: Dim2004
Дата сообщения: 11.10.2005 15:21
linker11

Цитата:
проблема такая . при создании длл , в коде есть функции которые находяться в другом юните

Уж это точно не проблема. В общем, сначала изучаешь, какое соглашение о вызовах хочет "другая" среда разработки: как правило, это stdcall. Кроме того, твои функции ни в коем случае не должны выдавать наружу Exception-ы - лови их внутри и выдавай наружу код завершения "всё плохо".


Судя по твоему коду, ты взялся за задачу не по твоему уровню.
Автор: vserd
Дата сообщения: 11.10.2005 16:34
linker11

Цитата:
Читай доку по соглашениям о вызовах.
а где ее взять?

набираешь stdcall в IDE, затем курсор на полвину слова stdcall и кнопка F1
Автор: linker11
Дата сообщения: 12.10.2005 10:29
ребяті товарищи!!!!!
спасибо за советі .
Я в єтом деле новенький , так что задавать вопросі , простите буду для вас тупіе .
Как в дельфи мне отследить где воникает ексепшн.?
Лабвью відает сообщение о том что есть ексепшн вперделе внешнего кода візвіваемого длл
Автор: Pinocchio
Дата сообщения: 12.10.2005 11:41
Компиль DLL и EXE проекты со всеми галочками опций Debugging на вкладке Compiler.
Затем делай дебуг для DLL, а в параметрах запуска (Run Parameters) хостом ставь экзешник.
Автор: Dim2004
Дата сообщения: 12.10.2005 15:00
linker11

Сляпай на Delphi маленькое тестовое приложение, которое будет, например, вызывать функцию из DLL по нажатию на кнопку. Дальше см. совет тов. Pinocchio. Ещё раз повторюсь - из DLL, предназначенной для подключения к чему-то, отличному от прог на Delphi, никакие Exception-ы вылезать не должны.


Рекомендации основаны на опыте написания вспомогательной DLL для подключения в проект на Powerbuilder-е.
Автор: linker11
Дата сообщения: 12.10.2005 17:58

вообщкем написал преложение сделал все как сказали :после клика на кнопку приложения которое должно вызывать длл
а падла выдает сообшение :
access violation at 00000000.Read of address 00000000

и шо мне с этим делать?
Автор: Dim2004
Дата сообщения: 12.10.2005 18:50
linker11

Цитата:
access violation at 00000000.Read of address 00000000

Обращение к несозданному объекту. Кто будет за тебя создавать comm321?
Автор: linker11
Дата сообщения: 13.10.2005 10:12
так соmm321 уже создан ,он есть , те это компонент который скачал с интета.
Он работает и ехе-ик фурычит на все сто . И файл CPDReg.pas' это как раз и есть
тот юник который входит в компонент сомм321 ,
а вот длл которая вызывает функции из этоко компоннента не хочет работать.

Добавлено:
или мне нужно его создать в теле самой длл? тогда нужно писать все функции компонента поновой в теле длл?
так єто же гемор !!

Добавлено:
или мне нужно его создать в теле самой длл? тогда нужно писать все функции компонента поновой в теле длл?
так єто же гемор !!

Добавлено:
или мне нужно его создать в теле самой длл? тогда нужно писать все функции компонента поновой в теле длл?
так єто же гемор !!
Автор: OdesitVadim
Дата сообщения: 13.10.2005 11:37
linker11
тебе прийдётся динамически создавать экемпляр компонент. В exe он работал, потому что ты ставил его на форму - делфа создала за тебя.
самый простой вариант - переделай в таком стиле.

Код:
function StartCom(mn:integer):integer; export;
begin
count:=0;
if Comm321=nil then Comm321:=TCommPortDriver.create;
comm321.connect;
if (mn=1) and (comm321.connect=true )then
begin
comm321.Connect;
StartCom:=1 end
else
StartCom:=0;
end; procedure CloseCom;
begin
if Comm321.connected then Comm321.disconnect;
Comm321.free;
end;
Автор: vserd
Дата сообщения: 13.10.2005 12:10
linker11
Мне моих экстрасенсорных способностей не хватает чтобы из твоего описания понять где чего у тебя находится, и чего ты хочешь получить.


Цитата:
так соmm321 уже создан ,он есть , те это компонент который скачал с интета.
Он работает и ехе-ик фурычит на все сто . И файл CPDReg.pas' это как раз и есть
тот юник который входит в компонент сомм321 ,
а вот длл которая вызывает функции из этоко компоннента не хочет работать.


Если твой первый пост это тело DLL, тогда ты должен создать и проинициализировать
Цитата:
comm321: TCommPortDriver;

Если ты его инициализируешь в EXE а хочешь вызывать в DLL тогда у тебя это не получится. Нужно наоборот, создавать в DLL и вызывать в EXE и не забыть про много поточность.



Автор: linker11
Дата сообщения: 13.10.2005 13:05
создать и проиницализировать :

comm321:TCommPortDriver;
потом ТАК
comm321:=TCommPortDriver.create(ЧТО ТУТ ПИСАТЬ?);
дело в том что у меня конструктор TCommPortDriver расписан так

constructor TCommPortDriver.Create( AOwner: TComponent );
begin
inherited Create( AOwner );
.....
END;
Автор: Pinocchio
Дата сообщения: 13.10.2005 15:18
linker11
Компонент в DLL и компонент в EXE это разные компоненты. Буть у них один и тот же класс, всё равно это разные компоненты, так как разные классы. И вся внутренность с операторами is и as будет работать наперекосяк пока ты сам не разберёшся где и чего ты хочешь. Ссылки на объекты в экспортных функциях участвовать не должны. Это относится к изучению мат. части.

Проще говоря функционал создающий компоненты обычно не экспортируется. Или экспортируется фабриками классов ActiveX.

И ещё при написании DLL часто забывают про Range checking и Overflow checking. Когда происходит передача отрицательного числа в DLL которая думает что получит DWORD, то такую ошибку практически невозможно поймать в дебаггере.
Автор: linker11
Дата сообщения: 13.10.2005 16:09
я наверное както сумбурно віражаюсь, єт от мало знания того чем занимаюсь

comm321:=TCommPortDriver.create(ЧТО ТУТ ПИСАТЬ?);
если


constructor TCommPortDriver.Create( AOwner: TComponent );
begin
inherited Create( AOwner );
.....
END;
те я на понимаю что давать на вход функции и накой это AOwner?




Добавлено:
ХЕЛПППППППППП!
Автор: linker11
Дата сообщения: 14.10.2005 09:45
ТОВАРИЩИ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ХЕЛПППППППППППППППППППППППППППППП!
УМРУУУУУУУУУУУУУУУУУУУУУУУУУУуу

comm321:=TCommPortDriver.create(ЧТО ТУТ ПИСАТЬ?);
если


constructor TCommPortDriver.Create( AOwner: TComponent );
begin
inherited Create( AOwner );
.....
END;
Автор: Pinocchio
Дата сообщения: 14.10.2005 12:38
linker11
Если хочешь чтобы некий AOwner мог автоматом сделать comm321.free, когда будет этот овнер.free, то тогда передавай его, а если не хочешь то передавай nil. Но тогда тебе придётся самому делать comm321.free и тогда непонятно зачем тебе писать
TCommPortDriver = class(TComponent). Пиши class(TPersistent).
Автор: linker11
Дата сообщения: 14.10.2005 16:29
обьект вроде иннициализирован , врде все доолжно работать,
свойства я проставил. Че деалть
відает в процессе отладки что не передаеться значение в візіваемую функцию
и типі вроде везде совпадают
Автор: Pinocchio
Дата сообщения: 14.10.2005 19:25
linker11
Значит не передаётся таким способом, поищи другой. А что собственно говоря выдал тебе отладчик, я не понял. Дословно можно? А какие значения ты передаёшь? Если так общаться - то это не работа. Ты же не хочешь чтобы я догадывался, что ты хотел на экране увидеть? Ты изучаешь интересную тему, готовься общаться так чтобы было интересно даже ламерам.

Добавлено:
Да,... а если будешь обижаться то это уже тем более не работа. Так что
Автор: vserd
Дата сообщения: 15.10.2005 10:49

Цитата:
comm321:=TCommPortDriver.create(ЧТО ТУТ ПИСАТЬ?);


comm321:=TCommPortDriver.create(nil);
Цитата:
обьект вроде иннициализирован , врде все доолжно работать,
свойства я проставил. Че деалть
відает в процессе отладки что не передаеться значение в візіваемую функцию
и типі вроде везде совпадают


или если у тебя есть какой-то компонент, тогда
comm321:=TCommPortDriver.create(SameComponent);

Для начала пишем в обработчике событий и в функциях экспортируемых из DLL
примерно такой код
MessageBox(0, Pchar('Param1=' + Param1 + ' Param2 = '+ Param2), Pchar('DLL_function_Name'), 0);
Далее вызываешь свою DLL из приложения и смотришь, совпадают ли значения параметров с теми которые ты передаешь.

P.S. на будущее приводи код. А то разговариваем как слепые слона ощупывали.

Страницы: 1

Предыдущая тема: документацию по джава на русском


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.