Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.18;
Скачать: CL | DM;

Вниз

Передать ресурс dll клиенту при помощи SendBuf()   Найти похожие ветки 

 
Интересующийся   (2006-02-11 07:58) [0]

Всем доброе время суток.

Есть dll (создано мной) в которой есть набор ресурсов в виде текста и графики.

Нужно сделать следующее.
При обработке конекта от клиента нужно динамически подключить dll и при помощи SendBuf() передать эти ресурсы клиенту.

Подскажите, плиз, как это организовать?


 
Defunct ©   (2006-02-11 10:39) [1]

хех..

Во-первых может быть имеет смысл посмотреть в сторону SendStream?

Если же все-таки хотите работать через SendBuf - тогда придется организацать протокол, который обеспечит разбивку файлов на пакеты и склеивание пакетов в файлы на приеме.


 
Defunct ©   (2006-02-11 10:40) [2]

> организацать

организовать...


 
Интересующийся   (2006-02-11 12:18) [3]

> Во-первых может быть имеет смысл посмотреть в сторону SendStream?

А примера работы с SendStream нет?

> Если же все-таки хотите работать через SendBuf - тогда придется организаdать протокол,

А зачем здесь протокол разбивающий файлы на пакеты?

P.S.
Наскорлька я понимаю работа должна рооисходить следующим обрапзом:
1. Динамически грузим DLL при помощи LoadLibrary
2. Получаем указатель на интересующий нас ресурс.
3. Передать ресурс клиенту при помощи SendBuf().
4. Выгрузить dll.


 
Интересующийся   (2006-02-11 12:21) [4]

После получения указателя на ресурс в dll мне удалось только получить размер этого ресурса.

Может кто подскажет все процедуры при помощи которых можно работать с такими ресурсами?


 
Defunct ©   (2006-02-11 12:34) [5]

> А зачем здесь протокол разбивающий файлы на пакеты?

SendBuf не позволяет пересылать данные объемом больше TCP пакета. Объем TCP пакета ограничен от 1k до 64k взависимости от ОС и от реализации пакетного драйвера сетевой карты.

> Наскорлька я понимаю работа должна рооисходить следующим обрапзом:
не надо смешивать работу с DLL с пересылкой данных. Эти вещи абсолютно никак не связаны. Для начала попробуйте переслать файл объемом эдак хотябы 100-200kb.

> Может кто подскажет все процедуры при помощи которых можно работать с такими ресурсами?

Очевидно с помощью TResourceStream или TMemoryStream, что вам будет удобнее..


 
Интересующийся   (2006-02-11 12:58) [6]

Вот кусок кода процедуры с помощью которой мой сервер отдает файл:


try
assignfile(f,Путь к файлу);
reset(f,1);
except
end;

........

while not eof(f) do
begin
blockread(f,buf[0],1024,frc);
if not fsocket.Connected then exit;
while fsocket.SendBuf(buf[0],frc)=-1 do if not fsocket.Connected then exit else
end;
finally
closefile(f);
end;


Вопрос о том как подобным образом органиховать отправку ресурса из DLL.

P.S.
Существенный дедастаток этого кода невозможность отправки файлов с атрибутом "Только чтение"


 
Интересующийся   (2006-02-11 13:05) [7]

Так меня интересует вопрос:

Как связать frc и ресурс на который я получил указатель?

P.S.
>SendBuf не позволяет пересылать данные объемом больше TCP пакета. >Объем TCP пакета ограничен от 1k до 64k взависимости от ОС и от реализации пакетного драйвера сетевой карты.

Насколько я понял из это текста blockread(f,buf[0],1024,frc) должно выглядеть как blockread(f,buf[0],64,frc)

Или я ошибаюсь?


 
Defunct ©   (2006-02-11 13:36) [8]

> try
> assignfile(f,Путь к файлу);
> reset(f,1);
> except
> end;

Неудивительно что у вас программа виснет..

> while fsocket.SendBuf(buf[0],frc)=-1 do if not fsocket.Connected then exit else
end;


А это для чего?

> Вопрос о том как подобным образом органиховать отправку ресурса из DLL.

Навеное точно также. Получаем данные из DLL и шлепаем их в Socket... В каком месте у Вас возникла проблема?


 
Defunct ©   (2006-02-11 13:40) [9]

> Как связать frc и ресурс на который я получил указатель?
что за frc?

> blockread(f,buf[0],1024,frc) должно выглядеть как blockread(f,buf[0],64,frc)

> Или я ошибаюсь?

Я дико извиняюсь, но помоему у вас в голове каша относительно всей темы, кстати, не только относительно работы с Socket.. Почитайте про TStream, указатели, файлы, механизм сокетов, TCP протокол.


 
Defunct ©   (2006-02-11 13:53) [10]

var
 Stream : TFileStream;
begin
  Stream := TFileStream.Create( "Путь к файлу", fmOpenRead );
  try
      FSocket.SendStream( Stream )
  finally
      Stream.Free
  end
end;


 
Интересующийся   (2006-02-11 14:21) [11]

1.
> что за frc?
Я извеняюсь, когда писал вопрос думал о другом :(

в начале процедуры объявлены:


Var
buf:array[0..1024]of byte;
frc:integer;


2.
> Неудивительно что у вас программа виснет..


try
assignfile(f,Путь к файлу);
reset(f,1);
except
........
end;


........ Клиенту получает инфу об ошибке
Неудобство када в ошибке при работе с файлами "Только для чтения"

3.
>while not eof(f) do
>begin
>blockread(f,buf[0],1024,frc);
>if not fsocket.Connected then exit;
>while fsocket.SendBuf(buf[0],frc)=-1 do if not fsocket.Connected then exit else
>end;
>finally
>closefile(f);
>end;

Общий смысл таков пока недостигнут конец файла f читать в буфер по 1024 байт и если есть соединение с клиентом пришим инфу в буфер.

P.S.

if not fsocket.Connected then exit;
while fsocket.SendBuf(buf[0],frc)=-1 do if not fsocket.Connected then exit else


Код писался больше года назад и почему он выглядит так я непомню :(
Просто эти строки перетикают из релиза в релиз.

Но общий смысл таков: если есть соединение с клиентом передать ему из бувера инфу.


 
Интересующийся   (2006-02-11 14:27) [12]

Defunct ©   (11.02.06 13:53) [10]

Спасибо за пример, значительно улучшило работу сервера!

А как переделать этот код для DLL?

P.S.
Есть статьи и примеры по этой теме?


 
Defunct ©   (2006-02-11 14:36) [13]

> А как переделать этот код для DLL?

Читаете ресурс из DLL, засовывете его в TMemoryStream и отправляете аналогично [10]...

> Есть статьи и примеры по этой теме?
Возможно. Но для начала нужно уточнить тему..


 
Интересующийся   (2006-02-11 14:52) [14]

> Читаете ресурс из DLL, засовывете его в TMemoryStream и отправляете аналогично

Вот по этой теме инфа и нужна.

P.S.
Я в формуе по API встречал перечень функций и процедур для работы с ресурсами в DLL.

На практике больше чем получить указатель на ресурс я несмог.
При выгрузке текста в файл результат представляет нечитаемую вещь (даже по размеру несовпадающую с текстом).

Нужен пример или инфа по вопросу получения ресурсов из DLL и выгрузке их в файл или передачи по сети.


 
Defunct ©   (2006-02-11 14:52) [15]

В общем, вам нужно свести все к TStream. Ресурс (по крайней мере тот,  что подключается к проекту с помощью .rc файла) считывается обычно с помощью TResourceStream. Поскольку TResourceStream является наследником TStream, то его можно использовать в качестве параметра функции Socket.SendStream.

Если говоря о ресурсе DLL, вы имеете в виду нечто другое (не .rc), тогда все должно сводиться к получению данных из DLL, занесению этих данных в TMemoryStream и отправке последнего с помощью той же функции Socket.SendStream.


 
Defunct ©   (2006-02-11 14:53) [16]

> Нужен пример или инфа по вопросу получения ресурсов из DLL и выгрузке их в файл или передачи по сети.

Задайте этот вопрос в соответствующей конференции - в "основной".


 
Defunct ©   (2006-02-11 14:58) [17]

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

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


 
Интересующийся   (2006-02-11 15:00) [18]

> Если говоря о ресурсе DLL, вы имеете в виду нечто другое (не .rc), тогда все должно сводиться к получению данных из DLL

Это мне и нужно.


 
Интересующийся   (2006-02-11 15:09) [19]

> Интересующийся   (11.02.06 15:00) [18]

Текст должет быть таков:
Мне нужно получить ресурсы представленные в виде графики и текста которые добавлены в DLL при помощи  .rc.


 
Kuzia   (2006-02-14 17:31) [20]

Пример работы с dll ресурсами, ресурсы в примере выбираются по номеру а не по имени (задается символом #) если планируется периодически модифицировать dll с ресурсами, то стоит использовать имя. Тип ресурсов (в примере RT_RCDATA – просто бинарный ресурс) должен четко соответствовать сохраненному в dll, иначе ресурс не будет найден. Список стандартных типов есть в win sdk help"е поставляемом вместе с Delphi.


procedure CreateEmptyDB;
const
 Ext : array[1..3] of String[4] = (".dat", ".str", ".txt");
 ResNum : array[1..3] of String[2] = ("#1", "#2", "#3");
var
 Count : Cardinal;
 Resource : HRSRC;
 Global : HGLOBAL;
 ResBuffer : Pointer;
 CleanDB : File;
begin
 for Count := 1 to 3 do
 begin
   Resource := FindResource(0, @ResNum[Count][1], RT_RCDATA);
   Global := LoadResource(0, Resource);
   ResBuffer := LockResource(Global);
   AssignFile(CleanDB, SavesDir + Name + Ext[Count]);
   Rewrite(CleanDB, SizeofResource(0, Resource));
   BlockWrite(CleanDB, ResBuffer^, 1);
   CloseFile(CleanDB);
 end;
end;


rc файл

1 RCDATA clear_accounts\accounts.dat
2 RCDATA clear_accounts\accounts.str
3 RCDATA clear_accounts\accounts.txt


 
Kuzia   (2006-02-14 17:38) [21]

Забыл добавить что 0 в FindResource и LoadResource это HMODULE те указатель на загруженную LoadLibrary библиотеку. В случае если ресурс лежит прямо в исполняемом файле – можно использовать 0.


 
SHAB   (2006-02-14 18:41) [22]

privet vsem. U menya est odna problema poxoje. Uje 2 nedeli isportil dlya etogo
:(
Nu vot tak ::
est 2 exe fayl.  Kotoriye rabotayu s bazoy dannix. 1-y server 2-oy klient.
1.exe soedinyaetsya s bazoy cherz komponent (nevizualniy) Session (TOraSession). Nado shtob  i  2.exe toje connectilsya s bazoy imenno s sessioy kotoriy prinadlejit  na 1.exe.  dlya etogo ya ispolzoval  "message map" dlya obmena dannimi mejdu prilojeniyami. zdelal vot tak
//////   posilayu na 1.exe iz 2.exe informachiyu o tom shto "ya voshla".
//////   potom  1.exe posilayet menya etot komponent
//////        (skoree vsego address  etogo komponenta). Vse poluchaetsya kak
//////   nado. No vot posledniy shag ne kak ne poluchaetsya. Xochu is polzovat
//////   etot komponent v drugom (2.exe)  prilojenii . No ne xochet.
//////   Nu esli ne mojno izpolzovat addresnuyu prostranstvu iz  drugogo
//////   prilojenii . A kak mojno reshit etu problemu ? Please Ochen srochno.

Vot i samiy posledniy moment (no oshibka :(  )

TOraSession *os1;
os1->AssignComponent("tut adres komponenta kotoriy posilaetsya iz 1.exe");

Deat acces violation at address...  .. . .. .  . ..

Zaranee blogodaren


 
SHAB   (2006-02-15 11:14) [23]

a ya poproboval i etu. No toje ne rabotal. Znachit eshe problema ne v tom shto komponent prenadlejit drugomu prilojeniyu. Potomu shto ya xotel Dublirovat komponent i iz etogo programmi - toje ne poluchilsya
vot tak :::
///////////
HANDLE newhandle;
DuplicateHandle(GetCurrentProcess(),    (HANDLE)SpeedButton4,
                     GetCurrentProcess(),    &newhandle,  
                     DUPLICATE_SAME_ACCESS,  FALSE, DUPLICATE_SAME_ACCESS);
CloseHandle(source_handle);

newhandle ravno NULL    
////////////////
vvrode bi vse ya napisal OK . vchem problema ?



Страницы: 1 вся ветка

Текущий архив: 2006.06.18;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.071 c
2-1148835732
Fiallo4ka
2006-05-28 21:02
2006.06.18
Базы данных в Delphi


15-1148560432
ArtemESC
2006-05-25 16:33
2006.06.18
BAT - файл...


15-1148096700
TUser
2006-05-20 07:45
2006.06.18
Бумажный спам


3-1145942532
Kley
2006-04-25 09:22
2006.06.18
Доступ к ODBC


2-1149154398
.ruslan
2006-06-01 13:33
2006.06.18
MonthCalendar1