Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.08.2017, 12:17   #1
FRoM
Новичок
Джуниор
 
Регистрация: 07.08.2017
Сообщений: 3
По умолчанию tIdUDPSocket в DLL

Добрый день!

Понадобилось написать простенькую внешнюю компоненту для 1С, общающуюся с железкой по UDP. Сначала, естественно, написал всё в обычном проекте. Отладил. Работает. Перенес код в DLL внешней компоненты, тоже отлаженной и рабочей. Вылетает с исключением при вызове конструктора TIdUDPClient.Create(). В консольном приложении тоже всё работает, а вот в DLL ни в какую. Что я не так делаю?

Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  IdBaseComponent,
  IdComponent,
  IdUDPBase,
  IdUDPClient;

var
  FUDPClient:TIdUDPClient;
  S,R,Str,PrnName:String;
  NBlk,Len:Integer;

function SendUDP(FUDPClient:TIdUDPClient; Host:String; Port:Integer; Str:String):String;
var
  R:String;
begin
  FUDPClient.Host:=Host;
  FUDPClient.Port:=Port;
  If FUDPClient.Binding.Port<>18253 then
  begin
    FUDPClient.Binding.Port:=18253;
    FUDPClient.Binding.Bind;
    FUDPClient.Active:=True;
  end;
  FUDPClient.Send(Str);
  R:=FUDPClient.ReceiveString(500);
  Result:=R;
end;

begin
  PrnName:='192.168.0.122';
  Str:='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  FUDPClient:=TIdUDPClient.Create(Nil);
  S:=Char($02)+Char($41)+Char($FF)+Char($20);
  R:=SendUDP(FUDPClient,PrnName,18251,S);
  NBlk:=0; Len:=81;
  While Len>0 do
  Begin
    S:=Char($02)+Char($41)+Char($FF)+Char($21)+Char(NBlk)+Copy(Str,1,79);
    Str:=Copy(Str,80,Length(Str)-79);
    Len:=Length(Str);
    R:=SendUDP(FUDPClient,PrnName,18251,S);
    NBlk:=NBlk+1;
  End;
  S:=Char($02)+Char($41)+Char($FF)+Char($21)+Char(NBlk)+Char($1B)+Char($64)+Char($08)+Char($1D)+Char($56)+Char($01);
  R:=SendUDP(FUDPClient,PrnName,18251,S);
  FUDPClient.Destroy;
end.
FRoM вне форума Ответить с цитированием
Старый 07.08.2017, 12:43   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

DLL как объект Windows знать не знает про разные объекты "надстроек" Delphi.
Цитата:
Код:
function SendUDP(FUDPClient:TIdUDPClient; Host:String; Port:Integer; Str:String):String;
компоненты(объекты) и DLL
http://www.programmersforum.ru/showt...ht=DLL+TObject
http://www.programmersforum.ru/showt...ht=DLL+TObject

P.S. а так же про string!!!
в D7 лекарство ShareMem(только для string!!! но не TObject) и это прямо прописано в исходнике головного модуля DLL

или же НЕ ИСПОЛЬЗОВАТЬ на стыке (НЕ ПЕРЕДАВАТЬ между DLL и основной программой) НИКАКИЕ данные за исключением ИЗВЕСТНЫХ windows(числа (включая идентификаторы системных объектов(окон) HWND) + указатели строк (LPSTR и аналоги))
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 07.08.2017 в 12:54.
evg_m вне форума Ответить с цитированием
Старый 07.08.2017, 13:03   #3
FRoM
Новичок
Джуниор
 
Регистрация: 07.08.2017
Сообщений: 3
По умолчанию

Там проблема не в передаче параметров, а в том, что при вызове конструктора TIdUDPClient вылезает исключение read at address 00000000
P.S. Причину в общем понял - в DLL отсутствует TObject, от которго, в конечном счете, наследован TIdUDPClient. А вот как побороть - не понял.
Сделал TDataModule в DLL, кинул на него компонент tIdUDPClient. Та же фигня - исключение при вызове конструктора.

Последний раз редактировалось FRoM; 07.08.2017 в 13:39.
FRoM вне форума Ответить с цитированием
Старый 07.08.2017, 14:40   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
а в том, что при вызове конструктора TIdUDPClient вылезает исключение read at address 00000000
Цитата:
P.S. Причину в общем понял - в DLL отсутствует TObject,
ответ неверный.
А вот всякие глобальные объекты используемые и создаваемые при ИНИЦИАЛИЗАЦИИ программы (в блокАХ initialization) созданы НЕ БУДУТ. и их использование(без иницализации) как раз и получат AV at 000000.
Цитата:
Код:
initialization
  GStackCriticalSection := TCriticalSection.Create;
BPL та же DLL но с "подключеным" выполнением блоков initialization.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 07.08.2017, 15:10   #5
FRoM
Новичок
Джуниор
 
Регистрация: 07.08.2017
Сообщений: 3
По умолчанию

Где бы еще посмотреть, какого именно объекта не хватает, чтобы его руками создать? Шерстить весь код конструкторов по цепочке наследования TIdUDPClient?
FRoM вне форума Ответить с цитированием
Старый 07.08.2017, 16:37   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Где бы еще посмотреть, какого именно объекта не хватает, чтобы его руками создать?
Я же сказал какого(см. выше)

Цитата:
Шерстить весь код конструкторов по цепочке наследования TIdUDPClient?
а это совсем немного.
Код:
unit IdUDPClient;
  TIdUDPClient = class(TIdUDPBase)
Код:
unit IdUDPBase;
  TIdUDPBase = class(TIdComponent)
Код:
unit IdComponent;
  TIdComponent = class(TIdBaseComponent)
и ВСЕ!!!
Цитата:
чтобы его руками создать?
вот только сделать-то "РУКАМИ" ничего нельзя.
Цитата:
Код:
implementation

Uses
  SyncObjs;

var
  GInstanceCount: Integer = 0;
  GStackCriticalSection: TCriticalSection;
переменная ЗАКРЫТА от всяких "шаловливых" ручек.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 07.08.2017 в 16:42.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Инструкция для сборки приложений на Qt в один exe без зависимостей от libstdc++-6.dll, libgcc_s_dw2-1.dll, Qt5Core.dll и т.д. 8Observer8 Qt и кроссплатформенное программирование С/С++ 12 25.06.2015 03:18
C# & DLL: как указать, что загружать DLL нужно из ЗАДАННОЙ папки "D:\My\Path\a.dll" ? AntyDES C# (си шарп) 11 10.10.2012 20:00
Debugger Kernel BORDBK160.DLL or BORDBK160N.DLL is missing or not registered. Человек_Борща Общие вопросы Delphi 0 15.07.2012 14:01
Ошибка при выхове функций Bass.dll из другой DLL SalasAndriy Общие вопросы Delphi 7 21.10.2009 23:36