Форум программистов  
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 07.08.2017, 13:17   #1
FRoM
Новичок
 
Регистрация: 07.08.2017
Сообщений: 3
Репутация: 10
По умолчанию 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, 13:43   #2
evg_m
Профессионал
 
Регистрация: 20.04.2008
Сообщений: 4,420
Репутация: 1965
По умолчанию

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 в 13:54.
evg_m вне форума   Ответить с цитированием
Старый 07.08.2017, 14:03   #3
FRoM
Новичок
 
Регистрация: 07.08.2017
Сообщений: 3
Репутация: 10
По умолчанию

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

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

Цитата:
а в том, что при вызове конструктора 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, 16:10   #5
FRoM
Новичок
 
Регистрация: 07.08.2017
Сообщений: 3
Репутация: 10
По умолчанию

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

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

Цитата:
Шерстить весь код конструкторов по цепочке наследования 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 в 17:42.
evg_m вне форума   Ответить с цитированием
Ответ



Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Инструкция для сборки приложений на Qt в один exe без зависимостей от libstdc++-6.dll, libgcc_s_dw2-1.dll, Qt5Core.dll и т.д. 8Observer8 Qt и кроссплатформенное программирование С/С++ 12 25.06.2015 04: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




15:33.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru