Тема: Opera*
Показать сообщение отдельно
Старый 18.06.2007, 12:14      #74
lpn_com
Пользователь
Пользователь Internet Explorer
 
Аватар для lpn_com
По умолчанию

Написал тут небольшую програмку, вроде плогинчега, но если кто хочет может пользоваться)
Задача проги переделывать ссылки из вида http://disk.karelia.ru в вид \\Diskpublic.karelia.ru
После установки в меню Оперы появятся новые пункты

При выборе пункта "Open" файл откроется (можно прослушать например mp3 не закачивая сам файл)
При выборе пункта "Explore" откроется папка где лежит файл (удобно для скачки большой пачки файлов)

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

Cразу скажу что программа не висит в памяти, а закрываеться сразу после обработки нужной ссылки.

Скачать можно здесь -> http://disk.karelia.ru/?d=1&f=lpn_co...+Converter.exe

Если автоматом не ставится, то вот пособие по ручной установке
Спойлер
Берем отсюда программу http://disk.karelia.ru/?d=1&f=lpn_co...+Converter.exe и ложим её в папку C:\Program Files\Opera 9\program\plugins\ (здесь и далее путь до папки с Оперой конечно свой)
Далее открываем свое пользовательское меню (открывать блокнотом), оно находиться здесь C:\Program Files\Opera 9\defaults\standard_menu.ini
Если же используете не стандартное меню, то тогда изменения нужно вносить в него.
Смотреть какое меню активировано тут: Настройки->Дополнительно->Панели->Профили меню.
Варианты местонахождения .ini файлов :
C:\Program Files\Opera 9\profile\menu\
C:\Documents and Settings\USER\Application Data\Opera\Profile\
Теперь когда открыли .ini файл ищем раздел [Link Popup Menu]
и между строк "Item, 50216=Copy link" и "Item, 50761=Save link" втавляем две таких строчки
Item, "Explore" = Execute program,"C:\Program Files\Opera 9\Program\Plugins\Disk Link Converter.exe","Explore %l"
Item, "Open" = Execute program,"C:\Program Files\Opera 9\Program\Plugins\Disk Link Converter.exe","Open %l"
еще рас повторяю пути до Оперы подставляйте свои.


Исходик программы
Спойлер
Код:
#include <windows.h>

char* NDH="disk.karelia.ru\0";
char NetBiosStr[1000];
BYTE KOI[]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,
			0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,
			0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,
			0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,
			0xA0,0xA1,0xA2,0xA3,0xBA,0xBD,0xB3,0xBF,
			0xA8,0xA9,0xB4,0xAB,0xAC,0xB4,0xAE,0xB7,
			0xB0,0xB1,0xB6,0xA6,0xAD,0xB5,0xB2,0xAF,
			0xB8,0xB9,0xA4,0xBB,0xBC,0xA5,0xBE,0xA7,
			0xE1,0xE2,0xF7,0xE7,0xE4,0xE5,0xF6,0xFA,
			0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,
			0xF2,0xF3,0xF4,0xF5,0xE6,0xE8,0xE3,0xFE,
			0xFB,0xFD,0xFF,0xF9,0xF8,0xFC,0xE0,0xF1,
			0xC1,0xC2,0xD7,0xC7,0xC4,0xC5,0xD6,0xDA,
			0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,
			0xD2,0xD3,0xD4,0xD5,0xC6,0xC8,0xC3,0xDE,
			0xDB,0xDD,0xDF,0xD9,0xD8,0xDC,0xC0,0xD1};
BOOL Open;

INT WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
	if(strstr(lpCmdLine,"Open")==lpCmdLine) Open=TRUE;else Open=FALSE;
	
	//////////////////////////////////////////////////////////////////////////
	//		Поиск строки "disk.karelia.ru" в ссылке
	size_t Temp=strlen(NDH);
	while(_strnicmp(lpCmdLine,NDH,Temp)!=NULL)
	{
		if(*(lpCmdLine+1)==0) return FALSE;
		lpCmdLine+=1;
	}
	//////////////////////////////////////////////////////////////////////////
	//
	strcpy(NetBiosStr,"\\\\Diskpublic.karelia.ru\\public\\\0");
	//////////////////////////////////////////////////////////////////////////
	//	двигаем строку
	lpCmdLine+=Temp+2;
	//////////////////////////////////////////////////////////////////////////
	//	Ищем параметр "f=" в ссылке
	while(_strnicmp(lpCmdLine,"f=\0",2)!=NULL)
	{
		if(*(lpCmdLine+2)=='/') return FALSE;
		lpCmdLine+=1;
	}
	//////////////////////////////////////////////////////////////////////////
	// первая буква в имени пользователя как папка
	Temp=strlen(NetBiosStr);
	memcpy(NetBiosStr+Temp,lpCmdLine+2,1);
	CharLower(NetBiosStr+Temp);
	memset(NetBiosStr+Temp+1,'\0',1);
	strcat(NetBiosStr,"\\\0");
	//////////////////////////////////////////////////////////////////////////
	//	двигаем строку
	lpCmdLine+=2;
	//////////////////////////////////////////////////////////////////////////
	//	копируем остальную ссылку попутно меняя слэши и символы
	char* p_Temp=NetBiosStr+strlen(NetBiosStr);
	char Ch[]="0x00";
	BYTE chB;
	while(*lpCmdLine!='\0')
	{
		switch(*lpCmdLine)
		{
		case '+':
			*p_Temp=' ';
			lpCmdLine+=1;
			p_Temp+=1;
			break;
		case '/':
			*p_Temp='\\';
			lpCmdLine+=1;
			p_Temp+=1;
			break;
		case '%':
			memcpy(Ch+2,lpCmdLine+1,2);
			chB=(BYTE)strtol(Ch,NULL,16);
			if(chB>=128&&chB<=255)
			{			
				switch(chB)
				{
				case 0xA3: *p_Temp=0xB8;break; // буквы Ёё
				case 0xB3: *p_Temp=0xA8;break;
				default:
					int i;i=0;
					while(chB!=KOI[i]&&i<=128) i+=1;
					*p_Temp=i+128;
				    break;
				}
			}
			else *p_Temp=chB;
			lpCmdLine+=3;
			p_Temp+=1;
			break;
		default:
			*p_Temp=*lpCmdLine;
			lpCmdLine+=1;
			p_Temp+=1;
		    break;
		}
	}

	//////////////////////////////////////////////////////////////////////////
	//	Узнаем существует ли файл
		DWORD GFA=GetFileAttributes(NetBiosStr);
		if(GFA==-1)		// если не существует то выходим и копируем путь в буфер обмена
		{
			char Buf[500];
			strcpy(Buf,"Не удаётся найти \0");
			strcat(Buf,NetBiosStr);
			strcat(Buf+strlen(Buf),"\n\0");
			strcat(Buf,"Путь скопирован в буфер обмена.");

			OpenClipboard(NULL);
			HGLOBAL hgBuffer;
			char* chBuffer;
			EmptyClipboard();
			hgBuffer= GlobalAlloc(GMEM_DDESHARE, strlen(NetBiosStr)+1);
			chBuffer= (char*)GlobalLock(hgBuffer);
			strcpy(chBuffer,NetBiosStr);
			GlobalUnlock(hgBuffer);
			SetClipboardData(CF_TEXT,hgBuffer);
			CloseClipboard();
			

			MessageBox(NULL,Buf,"Error",MB_OK);
			return FALSE;
		}
		//////////////////////////////////////////////////////////////////////////
		//
		if(GFA&FILE_ATTRIBUTE_DIRECTORY)		// Если дирка
		{
			ShellExecute(NULL,"Open",NetBiosStr,"","", SW_SHOWNORMAL);
		}
		else									// Если файл
		{
			if(Open)
			{
				if(strcmpi(NetBiosStr+strlen(NetBiosStr)-4,".exe")==0)
				{
					MessageBox(NULL,"низя","Exe",MB_OK|MB_ICONSTOP);
					return FALSE;
				}
				ShellExecute(NULL,"Open",NetBiosStr,"","", SW_SHOWNORMAL);
			}
			else
			{
				*(strrchr(NetBiosStr,'\\'))='\0';
				ShellExecute(NULL,"Open",NetBiosStr,"","", SW_SHOWNORMAL);
			}
		}
		

	
	return TRUE;
}

Исходник инсталятора
Спойлер
Код:
#include <windows.h>

INT WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
	DWORD PathLen=MAX_PATH;
	char ModPath[MAX_PATH];
	char PlugPath[MAX_PATH];
	char SelfPath[MAX_PATH];
	char INIBuff[1000];
	char newINIBuff[1000];
	char* Params[25];
	BOOL Install;

	char* Str1="Item, \"Explore\" = Execute program,\"";
	char* Str2="\",\"Explore %l\"";
	char* Str3="Item, \"Open\" = Execute program,\"";
	char* Str4="\",\"Open %l\"";

	//Item, "Explore" = Execute program,"","explore %l"
	//Item, "Open" 	= Execute program,"","open %l"

	switch(MessageBox(NULL,"Для установки нажмите Yes, Для удаления нажмите No.","Disk Link Converter Installer",MB_YESNOCANCEL))
	{
	case IDYES:
		Install=TRUE;
		break;
	case IDNO:
		Install=FALSE;
	    break;
	default:
		return TRUE;
	    break;
	}
	
	 

	//////////////////////////////////////////////////////////////////////////
	//	Читаем пути до Оперы из реестра
	HKEY m_HWNDK;
	RegOpenKey(HKEY_CURRENT_USER,"Software\\Opera Software",&m_HWNDK);
	if(RegQueryValueEx(m_HWNDK,"Plugin Path",NULL,NULL,(LPBYTE)PlugPath,&PathLen))
	{
		MessageBox(NULL,"Opera не найдена.","Error",MB_OK|MB_ICONSTOP);
		return FALSE;
	}
	RegQueryValueEx(m_HWNDK,"Last CommandLine",NULL,NULL,(LPBYTE)ModPath,&PathLen);
	RegCloseKey(m_HWNDK);
	//////////////////////////////////////////////////////////////////////////
	//	Копируем или удаляем программу
	GetModuleFileName(NULL,SelfPath,MAX_PATH);
	*(strrchr(SelfPath,'\\')+1)=0;
	strcat(SelfPath,"Disk Link Converter.exe\0");
	strcat(PlugPath,"\\Disk Link Converter.exe\0");
	if(Install) CopyFile(SelfPath,PlugPath,FALSE);
	else DeleteFile(PlugPath);
	//////////////////////////////////////////////////////////////////////////
	//	Вставляем пункты своего меню
	*(strrchr(ModPath,'\\')+1)=0;
	strcat(ModPath,"defaults\\standard_menu.ini\0");
	if(!GetPrivateProfileSection("Link Popup Menu",INIBuff,999,ModPath))
	{
		if(Install)
		{
			MessageBox(NULL,"Файл \"standard_menu.ini\" не найден.","Error",MB_OK|MB_ICONSTOP);
			return FALSE;
		}
		else
		{
			MessageBox(NULL,"Удалено успешно.","Disk Link Converter Installer",MB_OK);
			return TRUE;
		}
		
	}
	char* p_Sec=INIBuff;int i=0;
	Params[i]=p_Sec;
	while(*p_Sec!=0||*(p_Sec+1)!=0)
	{
		if(*p_Sec==0)
		{
			i+=1;
			Params[i]=p_Sec+1;
			if(Install&&(strstr(p_Sec+1,"\"Explore\"")||strstr(p_Sec+1,"\"Open\"")))
			{
				MessageBox(NULL,"Уставлено успешно.","Disk Link Converter Installer",MB_OK);
				return TRUE;	// уже установлено
			}
		}
		p_Sec+=1;
	}
	p_Sec=newINIBuff;
	for (int j=0;j<=i;j++)
	{
		if((!Install)&&(strstr(Params[j],"\"Explore\"")||strstr(Params[j],"\"Open\""))) continue;
		strcpy(p_Sec,Params[j]);
		p_Sec+=strlen(Params[j])+1;
		if((Install)&&strstr(Params[j],"50216"))
		{
			strcpy(p_Sec,Str1);p_Sec+=strlen(Str1);
			strcpy(p_Sec,PlugPath);p_Sec+=strlen(PlugPath);
			strcpy(p_Sec,Str2);p_Sec+=strlen(Str2)+1;
			strcpy(p_Sec,Str3);p_Sec+=strlen(Str3);
			strcpy(p_Sec,PlugPath);p_Sec+=strlen(PlugPath);
			strcpy(p_Sec,Str4);p_Sec+=strlen(Str4)+1;
		}	
	}
	*p_Sec=0;
	
	if(!WritePrivateProfileSection("Link Popup Menu",newINIBuff,ModPath))
	{
		if(Install) MessageBox(NULL,"Установка не удалась.","Error",MB_OK|MB_ICONSTOP);
		else MessageBox(NULL,"Удаление не удалось.","Error",MB_OK|MB_ICONSTOP);
		return FALSE;
	}
	
	if(Install) MessageBox(NULL,"Установка завершилась успешно.\nПерезапустите Opera.","Disk Link Converter Installer",MB_OK);
	else MessageBox(NULL,"Удаление завершилась успешно.\nПерезапустите Opera.","Disk Link Converter Installer",MB_OK);

	return TRUE;
}
lpn_com вне форума Пол: Мужчина   Ответить с цитированием Вверх
Благодарности: 5
d1sco (02.07.2007), Progresso (22.06.2007), rumitr (20.06.2007), Vinsent (30.10.2007), zhurah (22.06.2007)