русский
Germany.ruForen → Архив Досок→ Programmierung

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

1314  1 2 alle
HMr завсегдатай02.05.08 12:23
HMr
NEW 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 
in Antwort HMr 02.05.08 12:23
Ты бы хоть среду выполнения процесса указал...
В общем случае - нет, не можешь.
В частном же случае, например под Виндами, можно получить хандле процесса при запуске и используя его послать сообщение процессу.
Кроме этого под Виндами есть другие методики, позволяющие автоматически запустить нужное приложение и передать ему параметры для обработки.
#2 
  Chipolino свой человек02.05.08 16:35
NEW 02.05.08 16:35 
in Antwort HMr 02.05.08 12:23
Это ты пытаешься придумать динамические библиотеки ? ;-)
#3 
HMr завсегдатай02.05.08 17:33
HMr
NEW 02.05.08 17:33 
in Antwort Chipolino 02.05.08 16:35
В ответ на:
Это ты пытаешься придумать динамические библиотеки ? ;-)

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

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

Как конкретно это делается???
#5 
Murr коренной житель02.05.08 17:51
Murr
NEW 02.05.08 17:51 
in Antwort 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 
in Antwort Murr 02.05.08 15:51
В ответ на:
Кроме этого под Виндами есть другие методики, позволяющие автоматически запустить нужное приложение и передать ему параметры для обработки.

вчера узнал, что через командную строку только 8 килобайт :(
#7 
  Chipolino свой человек02.05.08 20:45
NEW 02.05.08 20:45 
in Antwort 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 
in Antwort Chipolino 02.05.08 20:45
я тут как-то огреб по полной на деплойменте COM-компонентов под вистой. Терпение, напрягаемое годами, наконец лопнуло, решил распрощаться с этой расчудесной какашкой (я имею в виду COM, с вистой распрощаться в ближайшем будущем не выйдет). В итоге возникла проблема, схожая с той, что у аффтара топика. По большому счету удалось обойтись командной строкой. Кроме 1 случая, где ее длины не хватает. Майкрософтчеги в таком случае предлагают через темп файл :))
#9 
Murr коренной житель02.05.08 21:34
Murr
NEW 02.05.08 21:34 
in Antwort 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 
in Antwort digital.pilot 02.05.08 17:53
во многих юниксах тоже есть ограничения на длину командной строки, особенно в старых
#11 
AlexOtt завсегдатай03.05.08 11:45
AlexOtt
NEW 03.05.08 11:45 
in Antwort 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
07.05.08 11:53 
in Antwort 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 
in Antwort HMr 07.05.08 11:53
в котором сказанно, что мы сами можем компилировать длл
-----
Ну и где же здесь ДП?
Обычным образом создаете проект для ДЛЛ, добавляете ссылку напроект к основному проекту и все работает без посылок сообщений...
#14 
HMr завсегдатай07.05.08 16:59
HMr
NEW 07.05.08 16:59 
in Antwort Murr 07.05.08 15:23
Спасибо конечно.
Но не я понял вообще ничего
Вы могли бы пояснить
Что вы имеете в виду под
В ответ на:
"Ну и где же здесь ДП?"

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

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

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

Ты сначала внимательно мой вопрос прочитай. Какой нафиг проект для "той самой длл" "Та самая длл" вообще написана на Си и к моему проекту отношения не имеет. Это длл для ЧУЖОГО СТОРОННЕГО НЕ НАШЕГО приложения которое вообще не в .NET оно из нашего просто может быть вызвано при помощи Process.Start(...) с дополнительным параметром в качестве которого ключ говорящий что при старте этого приложения должна еще быть подгружена эта длл. Не НАШЕ приложение использует эту длл а ДРУГОЕ
Теперь надеюсь я доходчиво объяснил??? Просто задавая вопрос любой человек ждет помощи а не совета почитать что нибудь или поискать в google......
#17 
Murr коренной житель08.05.08 00:12
Murr
NEW 08.05.08 00:12 
in Antwort 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 
in Antwort digital.pilot 02.05.08 17:53
вчера узнал, что через командную строку только 8 килобайт :(
-----
А если писать крышеку - "^" - в конце строки? :)
#19 
HMr завсегдатай08.05.08 14:45
HMr
NEW 08.05.08 14:45 
in Antwort 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 
1 2 alle