Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Как вызвать метод процесса в C#?

1314  1 2 все
HMr завсегдатай02.05.08 12:23
HMr
02.05.08 12:23 
Добрый день!
Подскажите пожалуйста как решить такую задачу.
В своем приложении я вызываю процесс v другое приложение при помощи
Process prc = Process.Start(╚AnyProcess.exe╩);
Могу ли я как то вызвать в моем приложении методы из "AnyProcess.exe", я знаю названия и требуемые параметры методов которые мне необходимо вызвать.
Зараннее благодарен за совет
#1 
Murr коренной житель02.05.08 15:51
Murr
NEW 02.05.08 15:51 
в ответ HMr 02.05.08 12:23
Ты бы хоть среду выполнения процесса указал...
В общем случае - нет, не можешь.
В частном же случае, например под Виндами, можно получить хандле процесса при запуске и используя его послать сообщение процессу.
Кроме этого под Виндами есть другие методики, позволяющие автоматически запустить нужное приложение и передать ему параметры для обработки.
#2 
  Chipolino свой человек02.05.08 16:35
NEW 02.05.08 16:35 
в ответ HMr 02.05.08 12:23
Это ты пытаешься придумать динамические библиотеки ? ;-)
#3 
HMr завсегдатай02.05.08 17:33
HMr
NEW 02.05.08 17:33 
в ответ Chipolino 02.05.08 16:35
В ответ на:
Это ты пытаешься придумать динамические библиотеки ? ;-)

?????????
#4 
HMr завсегдатай02.05.08 17:36
HMr
NEW 02.05.08 17:36 
в ответ Murr 02.05.08 15:51
В ответ на:
Ты бы хоть среду выполнения процесса указал

WindowsXP
Спасибо за помошь, но если не трудно не могли бы вы пояснить
В ответ на:
и используя его послать сообщение процессу

Как конкретно это делается???
#5 
Murr коренной житель02.05.08 17:51
Murr
NEW 02.05.08 17:51 
в ответ HMr 02.05.08 17:36
Как конкретно это делается???
-----
Полностью описано у Рихтера
http://linux.7ka.mipt.ru/mslib/richter/
(не помню, было ли на русском и применительно к С#)
Если хочется быстро и есть понимание что там происходит, то
http://faqs.org.ru/progr/windows/win32_prog2.htm
http://www.sql.ru/forum/actualthread.aspx?tid=87689
Надеюсь, что под C# адаптируешь сам.
Ну если не случится, то в Гоогле - "послать сообщение процессу" + handle + C#...
Но Я бы на твоем месте сначала раз десять подумал - А надо ли оно для решения задачи?
#6 
  digital.pilot коренной житель02.05.08 17:53
digital.pilot
NEW 02.05.08 17:53 
в ответ Murr 02.05.08 15:51
В ответ на:
Кроме этого под Виндами есть другие методики, позволяющие автоматически запустить нужное приложение и передать ему параметры для обработки.

вчера узнал, что через командную строку только 8 килобайт :(
#7 
  Chipolino свой человек02.05.08 20:45
NEW 02.05.08 20:45 
в ответ digital.pilot 02.05.08 17:53
В ответ на:
вчера узнал, что через командную строку только 8 килобайт

В вин2000 только 2 кб .
Тупо захардкодили дегенераты микрософтовские ....
#8 
  digital.pilot коренной житель02.05.08 21:08
digital.pilot
NEW 02.05.08 21:08 
в ответ Chipolino 02.05.08 20:45
я тут как-то огреб по полной на деплойменте COM-компонентов под вистой. Терпение, напрягаемое годами, наконец лопнуло, решил распрощаться с этой расчудесной какашкой (я имею в виду COM, с вистой распрощаться в ближайшем будущем не выйдет). В итоге возникла проблема, схожая с той, что у аффтара топика. По большому счету удалось обойтись командной строкой. Кроме 1 случая, где ее длины не хватает. Майкрософтчеги в таком случае предлагают через темп файл :))
#9 
Murr коренной житель02.05.08 21:34
Murr
NEW 02.05.08 21:34 
в ответ digital.pilot 02.05.08 17:53
вчера узнал, что через командную строку только 8 килобайт :(
------
Я как-то анализировал, сколько надо иметь информации, чтобы в многопользовательской системе все работало без ошибок. По результатам - 4 хендла... 16 байт...
P.S. Данные, разумеется, идут отдельным потоком...
Что до командной строки - насколько помню в MS DOS 3.20 она была в 255 байт...
Но это не показатель - DCOM - запустится и получит... по крайней мере в обертках от Борланда...
#10 
AlexOtt завсегдатай03.05.08 11:44
AlexOtt
NEW 03.05.08 11:44 
в ответ digital.pilot 02.05.08 17:53
во многих юниксах тоже есть ограничения на длину командной строки, особенно в старых
#11 
AlexOtt завсегдатай03.05.08 11:45
AlexOtt
NEW 03.05.08 11:45 
в ответ HMr 02.05.08 12:23
в общем случае - нет, но можно использовать http://msdn.microsoft.com/en-us/library/aa365574(VS.85).aspx - только программы обе должны это поддерживать
#12 
HMr завсегдатай07.05.08 11:53
HMr
NEW 07.05.08 11:53 
в ответ HMr 02.05.08 12:23
Добрый день!
Вот пришлось снова вернуться к проблеме из за которой вопрос и был задан.
Возможно изначально вопрос был задан неверно √ прошу за это меня извинить.
Попытаюсь получше объяснить.
Есть наше приложение (.NET) назовем его НП и другое приложение (не .NET) назовем его ДП
В процессе работы НП может быть вызвано ДП.
Поставщик ДП предоставил папку с несколькими с-файлами и h-файлами и MAKE-файлом а также небольшое описание в котором сказанно, что мы сами можем компилировать длл на основе предоставленных файлов и запускать ДП с подгрузкой этой длл. В этих C-файлах определены лишь функции обрабоки каких либо событий ДП (OnStart, OnClose итд) Эти функции в настоящий момент либо пустые либо с вызовом MessageBox ну я так понимаю чтобы в качестве примера увидеть просто что что то происходит.
У меня три вопроса
1. Каким образом можно инициировать какое то событие в C
2 Каким образом компилировать эту ДЛЛ
3. Можем ли мы как то перехватить сообщение которое посылает ДП в нашем приложении НП
Зараннее благодарен за помошь.
#13 
Murr коренной житель07.05.08 15:23
Murr
NEW 07.05.08 15:23 
в ответ HMr 07.05.08 11:53
в котором сказанно, что мы сами можем компилировать длл
-----
Ну и где же здесь ДП?
Обычным образом создаете проект для ДЛЛ, добавляете ссылку напроект к основному проекту и все работает без посылок сообщений...
#14 
HMr завсегдатай07.05.08 16:59
HMr
NEW 07.05.08 16:59 
в ответ Murr 07.05.08 15:23
Спасибо конечно.
Но не я понял вообще ничего
Вы могли бы пояснить
Что вы имеете в виду под
В ответ на:
"Ну и где же здесь ДП?"

В ответ на:
Обычным образом создаете проект для ДЛЛ
Для какой длл и какой проект?
В ответ на:
добавляете ссылку напроект к основному проекту
На какой основной проект?
#15 
Murr коренной житель07.05.08 19:52
Murr
NEW 07.05.08 19:52 
в ответ HMr 07.05.08 16:59
Но не я понял вообще ничего
-----
Может все же почитать Рихтера? Или хотя бы какую-то литературу для начинающих работать с ДотНет?
Ведь придется буквально брать скриншоты и говорить - тыкни сюда, тыкни туда...
Для какой длл и какой проект?
------
Обычным образом, т.е. используя соответствующий пункт при выборе типа проекта создаем проект для ДЛЛ. Для той самой, которая будет использоваться в другом проекте и образец кода которой предоставлен.
На какой основной проект?
-----
Хорошо, поправлюсь - в общий, с другим/основным проектом, солюшен. Ссылку на проект ДЛЛ добавлять обычным образом - через контекстное меню на отображаемом дереве проектов в ДотНет Студио...
#16 
HMr завсегдатай07.05.08 20:26
HMr
NEW 07.05.08 20:26 
в ответ Murr 07.05.08 19:52
В ответ на:
Может все же почитать Рихтера? Или хотя бы какую-то литературу для начинающих работать с ДотНет?
Ведь придется буквально брать скриншоты и говорить - тыкни сюда, тыкни туда...

Ты конечно круче судя по твоему участию в форуме на этом сайте. Но и меня представлять до такой степени дураком тоже не надо.
Судя по твоему ответу ты просто не понял того очем я спрашиваю.
В ответ на:

Для той самой, которая будет использоваться в другом проекте и образец кода которой предоставлен.

Ты сначала внимательно мой вопрос прочитай. Какой нафиг проект для "той самой длл" "Та самая длл" вообще написана на Си и к моему проекту отношения не имеет. Это длл для ЧУЖОГО СТОРОННЕГО НЕ НАШЕГО приложения которое вообще не в .NET оно из нашего просто может быть вызвано при помощи Process.Start(...) с дополнительным параметром в качестве которого ключ говорящий что при старте этого приложения должна еще быть подгружена эта длл. Не НАШЕ приложение использует эту длл а ДРУГОЕ
Теперь надеюсь я доходчиво объяснил??? Просто задавая вопрос любой человек ждет помощи а не совета почитать что нибудь или поискать в google......
#17 
Murr коренной житель08.05.08 00:12
Murr
NEW 08.05.08 00:12 
в ответ HMr 07.05.08 20:26
Но и меня представлять до такой степени дураком тоже не надо.
-----
Хорошо, не буду.
Но чтобы ни Я, ни другие этого не делали - хотя бы формулируй вопрос более-мение внятно в письменном виде - телепаты из пары ты-я слабенькие и передача мозг-мозг не получается.
Из того, что было описано, как Я понял, имелось:
1. основное приложение
2. сторонняя длл, которую надо дергать
Это делается нормально напрямую, путем добавления ссылки на длл к проекту.
Если длл существует в виде отдельного проекта - лучше добавлять ссылку на проект.
Происхождение длл при этом большой роли не играет - Си, СРР, С#...
Но, как выяснилось в последнем описании, имелось несколько другое:
1. основное приложение
2. вспомогательное приложение
3. дополнительная длл для вспомогательного приложения
Требуется - после запуска обоих приложений указать вспомогательному приложению какую именно вспомогательную длл оно должно использовать...
Ответ уже дан выше, в первом посте - В общем случае (даже только под Виндами) проблема нерешаема. По крайней мере - на основании вышеперечисленных данных.
Теперь надеюсь я доходчиво объяснил???
------
Не вполне.
В частности - не указан тип второго приложения.
Без этого - невозможно сказать можно ли вообще послать ему сообщение, даже если есть хендле процесса.
Нужно так же знать детали организации длл - в состоянии ли она обрабатывать "свои" сообщения из общей очереди сообщений приложения.
Вызвать же конкректный метод из длл загруженной в сторонний процесс... относительно легко - как только доберешься до хендла этой самой длл, хранящиимся где-то в стороннем приложении...
#18 
Murr коренной житель08.05.08 00:15
Murr
NEW 08.05.08 00:15 
в ответ digital.pilot 02.05.08 17:53
вчера узнал, что через командную строку только 8 килобайт :(
-----
А если писать крышеку - "^" - в конце строки? :)
#19 
HMr завсегдатай08.05.08 14:45
HMr
NEW 08.05.08 14:45 
в ответ Murr 08.05.08 00:12
Ну вот разговаривал напрямую с разработчиком ╚Другого приложения╩ (Наконец то шеф понял что играть в испорченный телефон нет никакого смысла)
Да у меня действительно проблема с тем чтобы доходчиво задать вопрос. Но все же попробую v надо ведь добить до конца эту тему.
Итак, снова к нашим баранам:
Имеем
Наше приложение ╚НП╩
Другое приложение ╚ДП╩ (Чужое, написанное не на .NET)
Длл для ╚ДП╩ (Исходники которой предоставил нам разработчик ╚ДП╩ и которую мы сами можем компилировать исправив чего нибудь в исходниках)
Из консоли или например припомощи Process.Start(-) Мы можем запустить ╚ДП╩ просто как ДП.exe или же с некоторыми параметрами например:
ДП.exe -dll=C:\ДЛЛдляДП.dll в этом случае будет запущено ДП с дополнительной ДЛЛ
Или
ДП.exe -dd= HandleНП -dll=C:\ДЛЛдляДП.dll в этом случае будет запущено ДП с дополнительной ДЛЛ и в метод OnStart который имеется в ДЛЛдляДП.dll будет предано Handle нашего приложения.
Дальше у меня появляются вопросы (возможно глупые но я не вижу в этом ничего постыдного прошу только сильно не кидать камни и не плевать в моу сторону (можно но не сильно))
Как передать Handle нашего приложения я знаю, а вот дальше темный лес
Я догадываюсь что в нашем приложении нужно определить какую либо переменную типа object. Потом когда Handle нашего приложения будет внутри метода OnStart инициализировать эту переменную значением чего либо из ДЛЛ и потом уже в нашем приложении при помощи рефлексии работать с объектами из ДЛЛдляДП.
Но как это сделать в C ?
Ниже я привожу текст метода OnStart из примера исходника который предоставил разработчик ДП
//------------------------------------------------------------------------------
// wird unmittelbar nach dem Laden der 'DLL' aufgerufen
// Parameter:
// gg_class_t: (GGFunctions.h) die von GEOgraf bereitgestellte Funtionalität
// Options: der String aus der Startoption -db
//
// Beispiel:
// "c:\program files\gg\bin\ggwin.exe" -db="test1 test2" -dll="c:\program files\test\test.dll"
// Falls die Funktion 'OnStart' in der dll 'test.dll' existiert, wird sie
// wie folgt aufgerufen:
// OnStart (ggfuncs, "test1 test2");
//------------------------------------------------------------------------------
void OnStart (gg_class_t* functions, LPCTSTR Options, LPCTSTR System)
{

}
Разработчик сказал что в качестве Options мы можем передать Handle своего приложения.
Если я написал чтото очень запутанно еще раз прошу сильно не посылать.
Зараннее благодарен за помощь.
С уважением
HMr
#20 
  femidav прохожий08.05.08 15:24
NEW 08.05.08 15:24 
в ответ HMr 08.05.08 14:45
Как говорится, сеть в помощь - http://en.wikipedia.org/wiki/Inter-process_communication
#21 
Murr коренной житель08.05.08 17:38
Murr
NEW 08.05.08 17:38 
в ответ HMr 08.05.08 14:45
Разработчик сказал что в качестве Options мы можем передать Handle своего приложения.
-----
Опять все вывернулось наизнанку!!!
Чуток выше говорилось, что необходимо "дергать" медоды ДДЛки.
Теперь же - передать свой хендле в ДЛЛку. Это поможет только в одном - ОнСтарт() может использовать этот хендле чтобы передать обратно свой хендле. Сделай в своем приложении метод, который в состоянии обработать прием чужего хендла и вызывай его из ОнСтарт(). Об том, как это сделать Я постил линки выше.
Вообще-то, получается слишком запутано. Стоит изложить не проблему в которую ты уперся, а задачу которую пытаешься решить - вполне возможно существует относительно простое решение...
По Сишному коду - надо смотреть опреление gg_class_t - возможно, что это "кляуза" (т.е. уже готовый указатель на метод объекта) и не надо маяться с тем что и как вызывать... хотя - маловероятно. Тем более - не описано откуда он берется.
Да, кстати, описание в комментариях не соответствует заголовку функции. Для Сей это не проблема, но для плюсов это уже другой метод.
#22 
HMr завсегдатай08.05.08 20:26
HMr
NEW 08.05.08 20:26 
в ответ Murr 08.05.08 17:38, Последний раз изменено 08.05.08 20:43 (HMr)
В ответ на:
Опять все вывернулось наизнанку!!!

Так я сказал же, что шеф наконец то перестал маяться х...ней, играть в испорченный телефон и решил связать меня с разрабочиком ╚Другого приложения ДП╩ напрямую. Ну и все стало в этом отношении ясно.
В ответ на:
Теперь же - передать свой хендле в ДЛЛку. Это поможет только в одном - ОнСтарт() может использовать этот хендле чтобы передать обратно свой хендле. Сделай в своем приложении метод, который в состоянии обработать прием чужего хендла и вызывай его из ОнСтарт().

Ну я так и написал в своем предыдущем сообщении (возможно не совсем внятно)
В ответ на:
Об том, как это сделать Я постил линки выше.

Ну а чисто по человечески хотябы пару строчек сишного кода или конкретно где все это в твоем линке (название например). Просто все смешалось, хорошо забытое старое новое итд... а тут еще вообще поговорить не с кем в общаюсь только на форуме. А... да что говорить...
PS
В ответ на:
По Сишному коду - надо смотреть опреление gg_class_t - возможно, что это "кляуза" (т.е. уже готовый указатель на метод объекта) и не надо маяться с тем что и как вызывать... хотя - маловероятно. Тем более - не описано откуда он берется.

есть это описание - это структура содержащая в том числе и указатели на методы "ДП"
Я понимаю что в нашем приложении нужно сделать что то типа
public class A
{
public IntPtr drugoePrilozhenieH;
}
А , в OnStart нужно делать как то так
void OnStart (gg_class_t* functions, LPCTSTR Options, LPCTSTR System)
{

HINSTANCE myAppH = Options;
}
Ну а дальше как??? Пожалуйста подскажите. Как в OnStart инициализировать мою переменную drugoePrilozhenieH
Зараннее благодарен
С уважением
HMr
#23 
Murr коренной житель09.05.08 00:06
Murr
NEW 09.05.08 00:06 
в ответ HMr 08.05.08 20:26
Ну и все стало в этом отношении ясно.
-----
Настолько, что поменялось направление передачи данных?
Я, например, уже перестал понимать что, откуда и куда должно пасоваться.
Ну а чисто по человечески хотябы пару строчек сишного кода
-----
Сишного - не попалось, дал - паскалевский - последний из трех линков. В сишном - все тоже самое.
Дополнительно. В сишном виде, но урезанное дано тут:
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1621400&SiteID=1
Поискать можно по МСДНу
"Inter Process Communication" SendMessage
или только по применению SendMessage(). Плюс - смотри внизу.
есть это описание
-----
Угу... кто посмотрел - выскажется подробнее. :)
public IntPtr drugoePrilozhenieH;
-----
Есть, по крайней мере мне встречался, вполне определенный тип для хранения хендлов - HINSTANCE. Незачем придумывать еще одну сущность.
HINSTANCE myAppH = Options;
-----
Ну вот и HINSTANCE. Правда передаваемый параметр имеет тип LPCTSTR - указатель на строку и это отнюдь не хендле вызывающего приложения. Как конвертнуть - зависит от того как ты его закодишь для передачи и как его покорежит при передаче. В любом случае - этот параметор не сам хендле.
Как в OnStart инициализировать мою переменную
-----
Думаю, что проще всего - через SendMessage() и доработку оконной процедуры в основном приложении для ловли этого мессаджа.
Попутно - как ты собираешься выяснять хендле загруженной библиотеки? :) Насколько Я помню, его можно поймать только при загрузке... которую у тебя выполняет чужое (закрытое) приложение... Позднее будет получаться хендле всего приложения, а не либы...
#24 
HMr завсегдатай09.05.08 00:23
HMr
NEW 09.05.08 00:23 
в ответ Murr 09.05.08 00:06
В ответ на:
public IntPtr drugoePrilozhenieH;
-----
Есть, по крайней мере мне встречался, вполне определенный тип для хранения хендлов - HINSTANCE. Незачем придумывать еще одну сущность.

Это пример нашего C#ного кода
В ответ на:
Ну вот и HINSTANCE.
В ответ на:
или только по применению SendMessage().

Так повспоминал старое, МСДН почитал пока ждал ответа твоего (не сочти за наглость я без всяких претензий на то что долго или не долго ждал - просто объясняю чем в этот промежуток времени занимался) Ну и твой ответ подтверждает что иду в нужном направлении или близком к нему
Спасибо еще раз за помощь
Хотя тему пока что не закрываю
#25 
Murr коренной житель09.05.08 01:31
Murr
NEW 09.05.08 01:31 
в ответ HMr 09.05.08 00:23
просто объясняю чем в этот промежуток времени занимался
-----
Прописывание двидюков, ужин, отдых, вечерний полив бэкярда...
Все одно между 18 и 22 часами на загрузку страницы уйдет минут пять... так что пусть Ослик понагружает сетку в это время...
#26 
HMr завсегдатай10.05.08 01:19
HMr
NEW 10.05.08 01:19 
в ответ Murr 09.05.08 01:31
Привет всем еще раз!
Как говорил ранее v тему не закрыл еще.
Попытался провести тест вот такой
Сделал приложение на С++ которое вызываю из нашего приложения .NET и привызове передаю ему Handle короче вот наше
private void button3_Click(object sender, EventArgs e)
{
Process.Start(@"C:\CA123A.exe", " " + this.Handle.ToString());

}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == 123)
{
bool b = true;
}
}
А вот на C++
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// MFC initialisieren und drucken. Bei Fehlschlag Fehlermeldung aufrufen.
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: Den Fehlercode an Ihre Anforderungen anpassen.
_tprintf(_T("Schwerwiegender Fehler bei der MFC-Initialisierung\n"));
nRetCode = 1;
}
else
{
//Пытаюсь послать сообщение нашему приложению
HWND hw = (HWND)(argv[1]);
SendMessageW(hw, 123, 1567,1);
}
return nRetCode;
}
Но вот почемуто в WndProc в нашем приложении этот Message не обрабатывается
В чем проблема????
Зараннее благодарен за помощь
С уважением HMr
#27 
Murr коренной житель10.05.08 02:38
Murr
NEW 10.05.08 02:38 
в ответ HMr 10.05.08 01:19
В чем проблема????
-----
Я тебе уже это описал... и весьма подробно.
Смотри с места - Ну вот и HINST...
Hint - распечатай хендле - отсылаемый и полученный.
#28 
NightWatch коренной житель10.05.08 12:49
NightWatch
NEW 10.05.08 12:49 
в ответ HMr 10.05.08 01:19
В ответ на:
Но вот почемуто в WndProc в нашем приложении этот Message не обрабатывается

В ответ на:
HWND hw = (HWND)(argv[1]);
Ты приводишь указатель на строку к HWND. А хэндл содержится в самой строке.
Нужна конвертация, типа этого.
HWND hw = (HWND)_tstoi(argv[1]);
#29 
1 2 все