Здесь обсуждаются технические аспекты создания дополнений.
			
		
		
			
				
																			
								Kbrais 							 
									
		Сообщения:  3  		Зарегистрирован:  22:29, 02.08.2012 		
		
						
						
		 
		
						
					
													
							
						
									
						Сообщение 
					 
								 Kbrais   »  22:33, 02.08.2012 
			
			
			
			
			Код: Выделить всё 
function fReadJpegImage(bInBuffer: PAnsiChar; var iOffset: Integer): TJpegImage;
var
  JpegStream: TJpegStream;
  DataSize: DWord;
begin
  JpegStream := TJpegStream.Create;
  try
    DataSize := PDWORD(bInBuffer)^;
    Inc(bInBuffer, SizeOf(DWord));
    JpegStream.SetPointer(bInBuffer, DataSize);
    Result := TJpegImage.Create;
    try
       Result.LoadFromStream(JpegStream);
       Inc(iOffset, DataSize);
    except
       Result.Free;
       raise;
    end;
  finally
    JpegStream.Free;
  end;
end;Составил функцию но нечего не выходит! Может кто знает в чём проблема?
 
			
			
									
						
										
						 
		 
				
		
		 
	 
				
		
		
			
				
																			
								KGB 							 
									
		Сообщения:  659  		Зарегистрирован:  08:54, 13.07.2010 		
		
																Откуда:  Чебоксары, Россия 
							
							
				Контактная информация: 
				
			 
				
		 
		
						
					
													
							
						
									
						Сообщение 
					 
								 KGB   »  23:51, 02.08.2012 
			
			
			
			
			Что-то мне подсказывает, что чтение начинается не с того адреса (bInBuffer разве не на начало буфера указывает? если да, то надо учитывать iOffset).
			
			
									
						
										
						 
		 
				
		
		 
	 
				
		
		
			
				
																			
								Kbrais 							 
									
		Сообщения:  3  		Зарегистрирован:  22:29, 02.08.2012 		
		
						
						
		 
		
						
					
													
							
						
									
						Сообщение 
					 
								 Kbrais   »  00:04, 03.08.2012 
			
			
			
			
			Можно пример учёта!?
			
			
									
						
										
						 
		 
				
		
		 
	 
				
		
		
			
				
																			
								KGB 							 
									
		Сообщения:  659  		Зарегистрирован:  08:54, 13.07.2010 		
		
																Откуда:  Чебоксары, Россия 
							
							
				Контактная информация: 
				
			 
				
		 
		
						
					
													
							
						
									
						Сообщение 
					 
								 KGB   »  00:08, 03.08.2012 
			
			
			
			
			Код: Выделить всё 
function fReadJpegImage(bInBuffer: PAnsiChar; var iOffset: Integer): TJpegImage;
var
  JpegStream: TJpegStream;
  DataSize: DWord;
begin
  JpegStream := TJpegStream.Create;
  try
    bInBuffer := bInBuffer + iOffset;
    DataSize := PDWORD(bInBuffer)^;
    Inc(bInBuffer, SizeOf(DWord));
    JpegStream.SetPointer(bInBuffer, DataSize);
    Result := TJpegImage.Create;
    try
       Result.LoadFromStream(JpegStream);
       Inc(iOffset, DataSize + 4);
    except
       Result.Free;
       raise;
    end;
  finally
    JpegStream.Free;
  end;
end;
Проверять сейчас не на чем, поэтому пример привел без проверки.
 
			
			
									
						
										
						 
		 
				
		
		 
	 
				
		
		
			
				
																			
								Kbrais 							 
									
		Сообщения:  3  		Зарегистрирован:  22:29, 02.08.2012 		
		
						
						
		 
		
						
					
													
							
						
									
						Сообщение 
					 
								 Kbrais   »  00:18, 03.08.2012 
			
			
			
			
			Теперь всё работает. Спасибо!
			
			
									
						
										
						 
		 
				
		
		 
	 
				
		
		
			
				
								Jenya-Grin 							 
									
		Сообщения:  356  		Зарегистрирован:  20:30, 22.09.2011 		
		
											Откуда:  Украина, г.Бердичев 
							
						
		 
		
						
					
													
							
						
									
						Сообщение 
					 
								 Jenya-Grin   »  04:55, 29.08.2012 
			
			
			
			
			В этом посте я приводил нерабочий код и просил помощи у Максима.
Но сумел решить сам. 
Готовенькое - ниже!  
 
			
			
													
					Последний раз редактировалось 
Jenya-Grin  05:26, 29.08.2012, всего редактировалось 1 раз.
									
 
			
						
										
						 
		 
				
		
		 
	 
				
		
		
			
				
								Jenya-Grin 							 
									
		Сообщения:  356  		Зарегистрирован:  20:30, 22.09.2011 		
		
											Откуда:  Украина, г.Бердичев 
							
						
		 
		
						
					
													
							
						
									
						Сообщение 
					 
								 Jenya-Grin   »  05:21, 29.08.2012 
			
			
			
			
			                                   
Часов 7 бился, и всётаки решилось.
100% рабочий код получения изображения на C++ : 
Функция чтения данных из буфера: 
Код: Выделить всё 
AnsiString fReadAnsi(BYTE * bInBuffer, int * iOffset)
{
	int iLength;
	memcpy(&iLength, bInBuffer + (*iOffset),4);
	(*iOffset)+=4;
	AnsiString uRet;
	uRet.SetLength(iLength);
	memcpy(uRet.c_str(), bInBuffer + (*iOffset),iLength*2);
	(*iOffset)+=iLength*2;
	return uRet;
} 
Инициализация события, чтение данных: 
Код: Выделить всё 
	if(dwID==1070) //сообщение в общий канал // ПЛАГИН СЕРВЕРНЫЙ !!!
	{
		UnicodeString uVirtualUserLogin = fReadText(bInBuffer, &iReadOffset);
		UnicodeString uSenderLogin = fReadText(bInBuffer, &iReadOffset);
		UnicodeString uSenderIP = fReadText(bInBuffer, &iReadOffset);
		int iSenderIcon = fReadInteger(bInBuffer, &iReadOffset);
		UnicodeString uChannel = fReadText(bInBuffer, &iReadOffset);
		int iMessageMode = fReadInteger(bInBuffer, &iReadOffset);
		TxtMsg = fReadText(bInBuffer, &iReadOffset);
		if ( TxtMsg == "[image]" )
		{
			AnsiString imgData = fReadAnsi(bInBuffer, &iReadOffset);
			GetImg(imgData);
		}
	} 
Преобразование из AnsiString в JPG и сохранение: 
Код: Выделить всё 
void GetImg(AnsiString iData)
{
	TJPEGImage *J = new TJPEGImage;
	TMemoryStream * ms1 = new TMemoryStream;
	ms1->Write((iData).c_str(),(iData).Length());
	ms1->Position = 0;
	J->LoadFromStream(ms1);
	delete ms1;
	J->SaveToFile("C:\\Documents and Settings\\1234\\Рабочий стол\\ax.jpg");
}
Ура! ура! ура!  
             
			
			
									
						
										
						 
		 
				
		
		 
	 
				
		
		
			
				
								Jenya-Grin 							 
									
		Сообщения:  356  		Зарегистрирован:  20:30, 22.09.2011 		
		
											Откуда:  Украина, г.Бердичев 
							
						
		 
		
						
					
													
							
						
									
						Сообщение 
					 
								 Jenya-Grin   »  09:52, 30.08.2012 
			
			
			
			
			С JPG и BMP всё отлично, однако при поступлении PNG изображения
сервер зависает вот после этих строк:
Код: Выделить всё 
AnsiString fReadAnsi(BYTE * bInBuffer, int * iOffset)
{
   int iLength;
   memcpy(&iLength, bInBuffer + (*iOffset),4); 
Если уж никак с PNG не решить, подскажите хотябы как сделать так чтоб не зависал.
тогда уже и исключение можно делать, оповещать что PNG например неподходит..
 
			
			
									
						
										
						 
		 
				
		
		 
	 
				
				
		
		
			
				
								Jenya-Grin 							 
									
		Сообщения:  356  		Зарегистрирован:  20:30, 22.09.2011 		
		
											Откуда:  Украина, г.Бердичев 
							
						
		 
		
						
					
													
							
						
									
						Сообщение 
					 
								 Jenya-Grin   »  05:08, 19.10.2012 
			
			
			
			
			Jenya-Grin писал(а):                                    
Функция чтения данных из буфера: 
Код: Выделить всё 
AnsiString fReadAnsi(BYTE * bInBuffer, int * iOffset)
{
	int iLength;
	memcpy(&iLength, bInBuffer + (*iOffset),4);
	(*iOffset)+=4;
	AnsiString uRet;
	uRet.SetLength(iLength);
	memcpy(uRet.c_str(), bInBuffer + (*iOffset),iLength*2);
	(*iOffset)+=iLength*2;
	return uRet;
} 
Инициализация события, чтение данных: 
Код: Выделить всё 
	if(dwID==1070) //сообщение в общий канал // ПЛАГИН СЕРВЕРНЫЙ !!!
	{
		UnicodeString uVirtualUserLogin = fReadText(bInBuffer, &iReadOffset);
		UnicodeString uSenderLogin = fReadText(bInBuffer, &iReadOffset);
		UnicodeString uSenderIP = fReadText(bInBuffer, &iReadOffset);
		int iSenderIcon = fReadInteger(bInBuffer, &iReadOffset);
		UnicodeString uChannel = fReadText(bInBuffer, &iReadOffset);
		int iMessageMode = fReadInteger(bInBuffer, &iReadOffset);
		TxtMsg = fReadText(bInBuffer, &iReadOffset);
		if ( TxtMsg == "[image]" )
		{
			AnsiString imgData = fReadAnsi(bInBuffer, &iReadOffset);
			GetImg(imgData);
		}
	} 
Преобразование из AnsiString в JPG и сохранение: 
Код: Выделить всё 
void GetImg(AnsiString iData)
{
	TJPEGImage *J = new TJPEGImage;
	TMemoryStream * ms1 = new TMemoryStream;
	ms1->Write((iData).c_str(),(iData).Length());
	ms1->Position = 0;
	J->LoadFromStream(ms1);
	delete ms1;
	J->SaveToFile("C:\\Documents and Settings\\1234\\Рабочий стол\\ax.jpg");
} 
 
Если постить маленькое изображение весом, то сохраняется.
Если например 10кб, то зависает вот в этой функции:
Код: Выделить всё 
AnsiString fReadAnsi(BYTE * bInBuffer, int * iOffset)
{
	int iLength;
	memcpy(&iLength, bInBuffer + (*iOffset),4);
	(*iOffset)+=4;
	AnsiString uRet;
	uRet.SetLength(iLength);
	memcpy(uRet.c_str(), bInBuffer + (*iOffset),iLength*2);
	(*iOffset)+=iLength*2;
	return uRet;
} 
Maxim Mirgorodsky , в чём может быть проблема?
 
			
			
									
						
										
						 
		 
				
		
		 
	 
				
		
		
			
				
																			
								Maxim Mirgorodsky 							 
						Администратор 			
		Сообщения:  6897  		Зарегистрирован:  09:56, 27.06.2005 		
		
						
						
		 
		
						
					
													
							
						
									
						Сообщение 
					 
								 Maxim Mirgorodsky   »  12:57, 22.10.2012 
			
			
			
			
			memcpy(uRet.c_str(), bInBuffer + (*iOffset),iLength*2); 
   (*iOffset)+=iLength*2; 
 
 
В этих строках ошибка. Если Вы читаете байты, то почему iLength*2? 
 
Правильно: 
 
   memcpy(uRet.c_str(), bInBuffer + (*iOffset),iLength); 
   (*iOffset)+=iLength;
			
			
									
						
										
						 
		 
				
		
		 
	 
				
		
		
			
				
								Jenya-Grin 							 
									
		Сообщения:  356  		Зарегистрирован:  20:30, 22.09.2011 		
		
											Откуда:  Украина, г.Бердичев 
							
						
		 
		
						
					
													
							
						
									
						Сообщение 
					 
								 Jenya-Grin   »  03:49, 23.10.2012 
			
			
			
			
			Maxim Mirgorodsky писал(а): memcpy(uRet.c_str(), bInBuffer + (*iOffset),iLength*2); 
   (*iOffset)+=iLength*2; 
 
 
В этих строках ошибка. Если Вы читаете байты, то почему iLength*2? 
 
Правильно: 
 
   memcpy(uRet.c_str(), bInBuffer + (*iOffset),iLength); 
   (*iOffset)+=iLength;
Большое спасибо. Проблема решена