Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Single Post  Topic: Подмена "штатного" сетевого окружения при возврате с хоста 
Author Message
MVV



PostPosted: Tue Apr 20, 2010 15:03    Post subject: Reply with quote

Avada wrote:
Мне кажется, тему лучше перенести в подфорум "Написание плагинов", поскольку обсуждаемые вопросы — достаточно специфические. Нет возражений?

У меня у самого такая мысль была - полотна исходников явно не для общего подфорума.

HankHank wrote:
В личке посмотри.

На вопросы по теме отвечу тут, может, кому-то пригодится. Надеюсь, не будешь сильно возражать.

HankHank wrote:
Покуролесил с вчерашним кодом в свете твоего сообщения о динамической памяти:
Code:

DWORD __stdcall BackgroundSendData(void* Data)
{
   int ii=SendMessage(hMainWnd, WM_COPYDATA, 0, (LPARAM) Data);
   return 0;
}

static COPYDATASTRUCT cds;
static char buffer[]="cd \\\\\\net";

bool ChangeCurrentDir()
{
   cds.dwData='DC';
   cds.lpData=&buffer;
   cds.cbData=sizeof(buffer);

   HANDLE thread=CreateThread(0, 0, &BackgroundSendData, &cds, 0, 0);
   if (!thread) return 0;

   CloseHandle(thread);
   return 1;
}

Передаваемая процессу память никуда теперь не исчезает. Но код проще. (Пробовал static char buffer[]="cd \\\\\\net" и static char buffer[]="\\\\\\net".)
Но что-то ничего не выходит…

Конечно, код проще. Тебе ж не нужно каждый раз менять содержимое буфера, поэтому и статический буфер подойдет.
А почему не работает, ща объясню. Видимо, ты плохо разобрался с форматом буфера для WM_COPYDATA, который ожидает ТК. Вот он:
Code:
<first_path>\r<second_path>\0<flags>

Флаги: 'T' - в новой вкладке, 'S' - менять пути активной и неактивной панелей вместо левой и правой.

Таким образом, правильный буфер:
Code:
static char cdnet[]="\\\\\\net\r\0S";

(то есть, изменить путь на \\\net в активной панели)

Но размер такого буфера уже функцией strlen не определишь - внутри есть нулевой символ. Поэтому либо TSIZE(cdnet), либо ручками циферку. И циферка обязательно должна включать нулевой байт в конце буфера - иначе ТК может хрен знает куда зайти в его поисках и набрать себе левых флагов из блока памяти за пределами буфера (я с таким уже сталкивался, обсуждение тут).
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
View user's profile Send private message ICQ Number


Powered by phpBB © 2001, 2005 phpBB Group