Вход на сайт
Как вызвать метод процесса в C#?
NEW 08.05.08 15:24
в ответ HMr 08.05.08 14:45
NEW 08.05.08 17:38
в ответ HMr 08.05.08 14:45
Разработчик сказал что в качестве Options мы можем передать Handle своего приложения.
-----
Опять все вывернулось наизнанку!!!
Чуток выше говорилось, что необходимо "дергать" медоды ДДЛки.
Теперь же - передать свой хендле в ДЛЛку. Это поможет только в одном - ОнСтарт() может использовать этот хендле чтобы передать обратно свой хендле. Сделай в своем приложении метод, который в состоянии обработать прием чужего хендла и вызывай его из ОнСтарт(). Об том, как это сделать Я постил линки выше.
Вообще-то, получается слишком запутано. Стоит изложить не проблему в которую ты уперся, а задачу которую пытаешься решить - вполне возможно существует относительно простое решение...
По Сишному коду - надо смотреть опреление gg_class_t - возможно, что это "кляуза" (т.е. уже готовый указатель на метод объекта) и не надо маяться с тем что и как вызывать... хотя - маловероятно. Тем более - не описано откуда он берется.
Да, кстати, описание в комментариях не соответствует заголовку функции. Для Сей это не проблема, но для плюсов это уже другой метод.
-----
Опять все вывернулось наизнанку!!!
Чуток выше говорилось, что необходимо "дергать" медоды ДДЛки.
Теперь же - передать свой хендле в ДЛЛку. Это поможет только в одном - ОнСтарт() может использовать этот хендле чтобы передать обратно свой хендле. Сделай в своем приложении метод, который в состоянии обработать прием чужего хендла и вызывай его из ОнСтарт(). Об том, как это сделать Я постил линки выше.
Вообще-то, получается слишком запутано. Стоит изложить не проблему в которую ты уперся, а задачу которую пытаешься решить - вполне возможно существует относительно простое решение...
По Сишному коду - надо смотреть опреление gg_class_t - возможно, что это "кляуза" (т.е. уже готовый указатель на метод объекта) и не надо маяться с тем что и как вызывать... хотя - маловероятно. Тем более - не описано откуда он берется.
Да, кстати, описание в комментариях не соответствует заголовку функции. Для Сей это не проблема, но для плюсов это уже другой метод.
NEW 08.05.08 20:26
Так я сказал же, что шеф наконец то перестал маяться х...ней, играть в испорченный телефон и решил связать меня с разрабочиком ╚Другого приложения ДП╩ напрямую. Ну и все стало в этом отношении ясно.
Ну я так и написал в своем предыдущем сообщении (возможно не совсем внятно)
Ну а чисто по человечески хотябы пару строчек сишного кода или конкретно где все это в твоем линке (название например). Просто все смешалось, хорошо забытое старое новое итд... а тут еще вообще поговорить не с кем в общаюсь только на форуме. А... да что говорить...
PS
есть это описание - это структура содержащая в том числе и указатели на методы "ДП"
Я понимаю что в нашем приложении нужно сделать что то типа
public class A
{
public IntPtr drugoePrilozhenieH;
}
А , в OnStart нужно делать как то так
void OnStart (gg_class_t* functions, LPCTSTR Options, LPCTSTR System)
{
HINSTANCE myAppH = Options;
}
Ну а дальше как??? Пожалуйста подскажите. Как в OnStart инициализировать мою переменную drugoePrilozhenieH
Зараннее благодарен
С уважением
HMr
В ответ на:
Опять все вывернулось наизнанку!!!
Опять все вывернулось наизнанку!!!
Так я сказал же, что шеф наконец то перестал маяться х...ней, играть в испорченный телефон и решил связать меня с разрабочиком ╚Другого приложения ДП╩ напрямую. Ну и все стало в этом отношении ясно.
В ответ на:
Теперь же - передать свой хендле в ДЛЛку. Это поможет только в одном - ОнСтарт() может использовать этот хендле чтобы передать обратно свой хендле. Сделай в своем приложении метод, который в состоянии обработать прием чужего хендла и вызывай его из ОнСтарт().
Теперь же - передать свой хендле в ДЛЛку. Это поможет только в одном - ОнСтарт() может использовать этот хендле чтобы передать обратно свой хендле. Сделай в своем приложении метод, который в состоянии обработать прием чужего хендла и вызывай его из ОнСтарт().
Ну я так и написал в своем предыдущем сообщении (возможно не совсем внятно)
В ответ на:
Об том, как это сделать Я постил линки выше.
Об том, как это сделать Я постил линки выше.
Ну а чисто по человечески хотябы пару строчек сишного кода или конкретно где все это в твоем линке (название например). Просто все смешалось, хорошо забытое старое новое итд... а тут еще вообще поговорить не с кем в общаюсь только на форуме. А... да что говорить...
PS
В ответ на:
По Сишному коду - надо смотреть опреление gg_class_t - возможно, что это "кляуза" (т.е. уже готовый указатель на метод объекта) и не надо маяться с тем что и как вызывать... хотя - маловероятно. Тем более - не описано откуда он берется.
По Сишному коду - надо смотреть опреление 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
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() и доработку оконной процедуры в основном приложении для ловли этого мессаджа.
Попутно - как ты собираешься выяснять хендле загруженной библиотеки? :) Насколько Я помню, его можно поймать только при загрузке... которую у тебя выполняет чужое (закрытое) приложение... Позднее будет получаться хендле всего приложения, а не либы...
-----
Настолько, что поменялось направление передачи данных?
Я, например, уже перестал понимать что, откуда и куда должно пасоваться.
Ну а чисто по человечески хотябы пару строчек сишного кода
-----
Сишного - не попалось, дал - паскалевский - последний из трех линков. В сишном - все тоже самое.
Дополнительно. В сишном виде, но урезанное дано тут:
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() и доработку оконной процедуры в основном приложении для ловли этого мессаджа.
Попутно - как ты собираешься выяснять хендле загруженной библиотеки? :) Насколько Я помню, его можно поймать только при загрузке... которую у тебя выполняет чужое (закрытое) приложение... Позднее будет получаться хендле всего приложения, а не либы...
09.05.08 00:23
Это пример нашего C#ного кода
Так повспоминал старое, МСДН почитал пока ждал ответа твоего (не сочти за наглость я без всяких претензий на то что долго или не долго ждал - просто объясняю чем в этот промежуток времени занимался) Ну и твой ответ подтверждает что иду в нужном направлении или близком к нему
Спасибо еще раз за помощь
Хотя тему пока что не закрываю
в ответ Murr 09.05.08 00:06
В ответ на:
public IntPtr drugoePrilozhenieH;
-----
Есть, по крайней мере мне встречался, вполне определенный тип для хранения хендлов - HINSTANCE. Незачем придумывать еще одну сущность.
public IntPtr drugoePrilozhenieH;
-----
Есть, по крайней мере мне встречался, вполне определенный тип для хранения хендлов - HINSTANCE. Незачем придумывать еще одну сущность.
Это пример нашего C#ного кода
В ответ на:
Ну вот и HINSTANCE.
Ну вот и HINSTANCE.
В ответ на:
или только по применению SendMessage().
или только по применению SendMessage().
Так повспоминал старое, МСДН почитал пока ждал ответа твоего (не сочти за наглость я без всяких претензий на то что долго или не долго ждал - просто объясняю чем в этот промежуток времени занимался) Ну и твой ответ подтверждает что иду в нужном направлении или близком к нему

Спасибо еще раз за помощь
Хотя тему пока что не закрываю
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
Как говорил ранее 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
NEW 10.05.08 12:49
Нужна конвертация, типа этого.
HWND hw = (HWND)_tstoi(argv[1]);
в ответ HMr 10.05.08 01:19
В ответ на:
Но вот почемуто в WndProc в нашем приложении этот Message не обрабатывается
Но вот почемуто в WndProc в нашем приложении этот Message не обрабатывается
В ответ на:
HWND hw = (HWND)(argv[1]);
Ты приводишь указатель на строку к HWND. А хэндл содержится в самой строке.HWND hw = (HWND)(argv[1]);
Нужна конвертация, типа этого.
HWND hw = (HWND)_tstoi(argv[1]);