Текущий архив: 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.51 MB
Время: 0.011 c