Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2006.06.18;
Скачать: [xml.tar.bz2];

Вниз

Передать ресурс 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.01 c
2-1148964349
kashmar
2006-05-30 08:45
2006.06.18
Хэлп по таблице


8-1137581849
hgd
2006-01-18 13:57
2006.06.18
Работа с graphics32


5-1133515534
Tonich
2005-12-02 12:25
2006.06.18
TDateTimePicker


15-1148551974
цуп
2006-05-25 14:12
2006.06.18
разрыв страницы


4-1142270326
dimak-2k
2006-03-13 20:18
2006.06.18
Работа с портом LPT





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский