1)Зарегились в 2002 году
2)Фанфты Microsoft
3)Защищают .NET
4)Пишут очень серьезные приложения
5)Обожают поспорить в соответствующей компании
6)Любят поучить HACKER'а как жить
А может это Бренд на поезде с другом по ноутбуку прикалываются...
Все эти слова (пайпы, оконные сообщения и т.д.) очень подробно описаны в MSDN, сомневаюсь, что смогу рассказать лучше. Пайп по-английски pipe.
MastMan не может быть Артемом, тот бы не стал одновременно заводить 2 акка
Да. Только пишу не Open Source-проекты и не ICQ-клиенты.
А разве из этого следует, что открытый код вообще никак не интересует?
>Пожалуйста, подробней.. я с таким ещё не сталкивался.. приведите примеры на разных языках его реализации..
План работы.
1. Берёшь структуру COPYDATASTRUCT, засовываешь в неё всё, что надо (в раздел lpData). Это может быть всё, что угодно, главное, чтобы ты сам потом головой о стену не бился, чтобы писать парсер (у асечников наверняка все лбы отбиты).
2. SendMessage'ем отправляешь сообщение окну с этой структурой и командой WM_COPYDATA. Винда сама проаллочит память, копирнёт твои данные в память другого процесса и известит нужное окно. Насколько я понимаю PostMessage для этой команды не катит, т.к. надо чтобы винда сама же ту память и освободила.
Все более-менее серьёзные виндовые языки, с поддержкой api сделают это безо всяких проблем, т.к. им и делать-то ничего не надо. Единственное, что приём сообщений на VB6 придётся ромадить через сабклассинг, но это, имхо, уже стандартый васюковый метод - можно даже сказать "встроенные средства VB"! 8))))
>пожалуйста, расшифровывайте ваши слова.. многим не понятно, и не забывайте примеры.
не, ну я же вроде ясно говорю?
Да и откуда мне знать, что кому-то непонятно?
Примеры влом писать - это же обычные вещи, здесь механизм важен, а реализация, это только вопрос времени.
Пайпы я не пробовал, но точно знаю, что в реале всё это выглядит абсолютно одинаково, просто фейс программный вуалирует проецирование файлов в память, поэтому кажется, что способы разные. Самое лучшее, это использовать самый низкий уровень - собс-на эти самые файлы. Когда мне понадобилось переступать границы процессов, я сначала зацепился за этот метод, но потом увидел, что он не избавляет от необходимости отправлять оконные сообщения с целью оповещения другого процесса об изменении данных и поэтому остановился на WM_COPYDATA. Файлы же нужны, если данных за один обмен много. Винамп вон, вообще обошёлся простыми оконными сообщениями - зато расширений сколько к нему!
Для аськоподобных же вещей, надо как минимум строки передавать.
не знаю что там есть в MSDN
я ввёл в поиск по нему.. и там спец. раздла по
pipe не было.
былы другие слова связанные с получением нового процесса и канала связи.. или типа того:
Visual Basic]
Dim myProcess As New Process()
Dim myProcessStartInfo As New ProcessStartInfo("Process_StandardOutput_Sample.exe"
myProcessStartInfo.UseShellExecute = False
myProcessStartInfo.RedirectStandardOutput = True
myProcess.StartInfo = myProcessStartInfo
myProcess.Start()
Dim myStreamReader As StreamReader = myProcess.StandardOutput
' Read the standard output of the spawned process.
Dim myString As String = myStreamReader.ReadLine()
Console.WriteLine(myString)
myProcess.Close()
ты про это? можешь дать ссылку раздела с сайта мелкософта.. или скопируй текст.. хочу разобраться
и что насчёт способа оконных сообщений?
(к примеру: хэндл отсылающего,номер протокола, команда, целочисленный параметр, строковый параметр*128, reserved 8 байт!) и потом WM_COPYDATA.
Я прочитал все посты! 8)
Просто хочу выразить несогласие по поводу ненужности 3000-го файлового менеджера. Он нужен - нужен тому, кто его пишет, иначе он никогда ничему не научиться. Это ступенька и задача форума (ИМХО) помочь перешагнуть всю ботву и двигаться вперёд. Мне вот нужны дрова на мой мопед для линуха, но я их не напишу, пока не перепишу парочку никому ненужных дров на существующие девайсы под винду. Тут важно понимание.
Кроме того, важно научиться УЧИТЬСЯ. Т.е. знать, где найти инфу, где и с кем порассуждать на эту тему.
Ещё остаются наработки (готовые классы, контролы, библии), которые в будущем помогут при изготовлении тех самых узкоспециализированных прог.
Да и что толку от форума, где обсуждают такие проги? Это же реально никому ненужные (и даже неинтересные) проги с точки зрения большинства форумлян.
Мне вот нужна прога для удалённого сброса альтивара, когда тот уходит в даун, после падения напряжения на городской линии. Интересующиеся есть?
Короче, народ, - кончайте снобить, а то создаётся впечатление, что это форум не для программирования, а для того, чтобы это направление забросили.
1. Берёшь структуру COPYDATASTRUCT, засовываешь в неё всё, что надо (в раздел lpData). Это может быть всё, что угодно, главное, чтобы ты сам потом головой о стену не бился, чтобы писать парсер (у асечников наверняка все лбы отбиты).
2. SendMessage'ем отправляешь сообщение окну с этой структурой и командой WM_COPYDATA. Винда сама проаллочит память, копирнёт твои данные в память другого процесса и известит нужное окно. Насколько я понимаю PostMessage для этой команды не катит, т.к. надо чтобы винда сама же ту память и освободила.
Neco, огробное спасибо, убедил..
но нельзяли хоть каплю кода написать.. а то я с такими вещами не сталкивался..
как отправить и как принять.. хотя бы на VB.
Имхо, этот код про редиректинг стандартного аутпута, о чём говорит RedirectStandardOutput.
Наверное, может получиться, но плохо представляю себе реализацию на С++, а следовательно не вполне понимаю, чтобы что-то советовать.
Собс-на вытащил из кода библиотеки перехвата, которая должна сообщать моей проге, что какой-нить там эксплорер или блокнот пытается (падла!) вызвать MsgBox.
int WINAPI clsCatcher::MyMessageBoxW(HWND hWnd ,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType)
{
int FuncRez=0;
LRESULT rez=0;
COPYDATASTRUCT cpyData;char* Data;int fullsz=0;
char* tmpStr;int tmpInt;
// имеет значение лишь отсюда
cpyData.dwData=0;
cpyData.cbData=fullsz;
cpyData.lpData=Data;
rez=SendMessage(wndChief,WM_COPYDATA,NULL,(LPARAM)&cpyData);
// и до сюда
if (rez) {
FuncRez=MessageBoxW(hWnd,lpText,lpCaption,uType);
}else{
FuncRez=2;
}
return FuncRez;
}
Приём на VB6 должен быть реализован через сабклассинг, а в моём случае (это был VB.NET), всё чуть проще:
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
If m.Msg = WM_COPYDATA Then
Debug.WriteLine("Оно!"
Dim cpyData As COPYDATASTRUCT
Dim ptr As New IntPtr
Dim md As String, mdr As myData
Dim arr() As Byte
Dim tmpSz As Integer, tmpInt As Integer, tmpStr As String
cpyData = CType(Marshal.PtrToStructure(m.LParam, GetType(COPYDATASTRUCT)), COPYDATASTRUCT)
ptr = New IntPtr(cpyData.lpData)
tmpSz = CType(GetValue(ptr), Integer)
tmpStr = CType(GetValue(ptr, tmpSz), String)
MsgBox(tmpStr)
m.Result = New IntPtr(102)
Exit Sub
End If
MyBase.WndProc(m)
End Sub