AlmaOs Опубликовано 23 апреля, 2013 Поделиться Опубликовано 23 апреля, 2013 Изначально хотел чтобы метод возвращал два значения, надеялся увидеть нечто вродеclassName.methodName(param1,param2).value1;className.methodName(param1,param2).value2;смотрел гугл ничего не нашелПоэтому т.к. значения вытягиваются из ProcessModule решил его так весь и вернуть,public static ProcessModule FindModule(string moduleName, int process_Id){ if (module) { return module; }}в случае с "if" означает что модуль найден, все нормально. Однако если модуль не найден то что возвращать то? Пытался создать объект ProcessModule через new, но VS пишет что конструктор для данного класса не определен, вручную конструктор тоже хз как объявить в таком случае. Прошу совета, либо как вернуть два значения из метода, либо вернуть что-нибудь если модуль не найден. Ссылка на комментарий Поделиться на другие сайты Поделиться
Laziz Опубликовано 24 апреля, 2013 Поделиться Опубликовано 24 апреля, 2013 можно так: IntPtr baseAdres; int MMsize; private void FindModule(string modulName, int process_Id) { var pr = Process.GetProcessById(process_Id); if (pr.Id != 0) { foreach (ProcessModule item in pr.Modules) { if (item.ModuleName == modulName) { baseAdres = item.BaseAddress; MMsize = item.ModuleMemorySize; } } } }Еще можно возвратит массив значение, если значение однотипные. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 24 апреля, 2013 Поделиться Опубликовано 24 апреля, 2013 Оперирование глобальными (по отношению к функции) переменными из самой функции - не есть хороший тон программирования. Для их модификации лучше в функцию передавать указатель на них. К примеру, так: IntPtr baseAdres = 0; int MMsize = 0; private void FindModule(string modulName, int process_Id, IntPtr *ba, int *mmsize) { var pr = Process.GetProcessById(process_Id); if (pr.Id != 0) { foreach (ProcessModule item in pr.Modules) { if (item.ModuleName == modulName) { *ba = item.BaseAddress; *mmsize = item.ModuleMemorySize; } } } }И при вызове функции передать переменные параметрами примерно так:FindModule(modname, pID, &baseAdres, &MMSize);В этом случае в функцию будут переданы адреса этих переменных, и в переменные в самой функции уже запишется то, что нужно. Впрочем, вышесказанное справедливо для языка С++, не знаю, насколько это актуально для С#. Ссылка на комментарий Поделиться на другие сайты Поделиться
AlmaOs Опубликовано 24 апреля, 2013 Автор Поделиться Опубликовано 24 апреля, 2013 можно так: IntPtr baseAdres; int MMsize; private void FindModule(string modulName, int process_Id) { var pr = Process.GetProcessById(process_Id); if (pr.Id != 0) { foreach (ProcessModule item in pr.Modules) { if (item.ModuleName == modulName) { baseAdres = item.BaseAddress; MMsize = item.ModuleMemorySize; } } } }Еще можно возвратит массив значение, если значение однотипные.Значения не однотипные, да и засовывать, потом доставать их оттуда тоже не интересно.И как функцию тоже не могу использовать т.к. вызов происходит из другого класса, если делать вывод тут же в переменные, то опять придется делать кучу телодвижений.Оперирование глобальными (по отношению к функции) переменными из самой функции - не есть хороший тон программирования. Для их модификации лучше в функцию передавать указатель на них. К примеру, так: IntPtr baseAdres = 0; int MMsize = 0; private void FindModule(string modulName, int process_Id, IntPtr *ba, int *mmsize) { var pr = Process.GetProcessById(process_Id); if (pr.Id != 0) { foreach (ProcessModule item in pr.Modules) { if (item.ModuleName == modulName) { *ba = item.BaseAddress; *mmsize = item.ModuleMemorySize; } } } }И при вызове функции передать переменные параметрами примерно так:FindModule(modname, pID, &baseAdres, &MMSize);В этом случае в функцию будут переданы адреса этих переменных, и в переменные в самой функции уже запишется то, что нужно. Впрочем, вышесказанное справедливо для языка С++, не знаю, насколько это актуально для С#.То что нужно! Спасибо, немного почитал про указатели, действительно удобно. Только в C# вместо * используется out или ref. Ссылка на комментарий Поделиться на другие сайты Поделиться
Laziz Опубликовано 25 апреля, 2013 Поделиться Опубликовано 25 апреля, 2013 На счет телодвижении, не знаю не знаю где больше... C# не даст обращаться в память просто так. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения