Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2008, 21:22   #1
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
Вопрос Передача хэндла через командную строку

Здравствуйте. Вопрос на первый взгляд ламерский, но я в нем затупился конкретно. Гугл мне не сильно помог, да и на форуме ничего толком не нашел.
Суть вопроса вот в чем. Нужно написать прогу (эт я сам как-нить ). В которой будет 3 процесса. Первый процесс создает файл (ну или открывает уже имеющийся), мэпает его, создает Мютекс. Потом создает два процесса второй проги (тоже сам как-нить напишу), в первый экземпляр передается дескриптор мютекса и имя проекции файла. А во второй - имя мютекса и имя проекции. Передача идет через командную строку.
Терь проблемы:
1. Создаю строку, для передачи в первый процесс в качестве командной. Пытаюсь туда скопировать (функцией strcpy) имя проекции, а на этой строке вылетает Exception и код ошибки 5, тоесть нету доступа. Нету доступа к той строке, которая будет использована в качестве командной, тоесть та, в которую копирую.
Код:
LPSTR lpCmd;
.........
strcpy(lpCmd, lpMutexName); <------вот тут ексепшн
2. Вопрос второй и главный. Как в командную строку занести дескриптор? При простом преобразовании типов вылетает прога и ошибка та же - доступа нет. При этом в этой строке должно быть еще имя отображения.

Помогите, а то вопрос (как я думал) в принципе не сложный, а вот инфы почти нету.

ПыСы: Язык С++

Последний раз редактировалось MaTBeu; 25.11.2008 в 21:26.
MaTBeu вне форума Ответить с цитированием
Старый 25.11.2008, 21:36   #2
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

2MaTBeu не очень вникал в суть вопроса, но всеж) ты память то выделил под lpCmd? т.к LPSTR это указатель на строку)
vvviperrr вне форума Ответить с цитированием
Старый 25.11.2008, 21:36   #3
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

во-первых, хендл это простое число.
во-вторых, если ты хендл (вернее цифру) передаш в другое приложение, то там он будет недействителен, приложение должно само открыть нужный объект.
у мьютексов есть имена, эти имена и передавай через командную строку.
rpy3uH вне форума Ответить с цитированием
Старый 25.11.2008, 21:43   #4
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

2vvviperrr
Код:
LPSTR lpCmd=new char[20];
Аналогично не пашет. Пишет опять же нету доступа.
2rpy3uH
В том, то и дело, что надо именно хэндл передать через командную строку (я смысла сам не понимаю, но препод сказал). Так же я не представляю как открывать мютекс чисто по хендлу (такого ж вроде нету???). Скажу преподу пускай правит задание.

ПыСы: а если адрес хэндла передавать?
MaTBeu вне форума Ответить с цитированием
Старый 25.11.2008, 22:08   #5
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от MaTBeu Посмотреть сообщение
В том, то и дело, что надо именно хэндл передать через командную строку (я смысла сам не понимаю, но препод сказал). Так же я не представляю как открывать мютекс чисто по хендлу (такого ж вроде нету???)
Если есть хэндл, значит мьютекс уже открыт.
Хэндлы можно передавать другой проге. Смысл этого в том, чтобы понять как это делается. А зачем это может применяться на практике - <?..>
Цитата:
Сообщение от MSDN: CreateProcess
bInheritHandles [in]
If this parameter TRUE, each inheritable handle in the calling process is inherited by the new process. If the parameter is FALSE, the handles are not inherited. Note that inherited handles have the same value and access rights as the original handles.
Somebody вне форума Ответить с цитированием
Старый 25.11.2008, 22:19   #6
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Тоесть вы хотите сказать, что надо просто наследовать хэндлы дочерних процессов от родителя? Ну и как потом можно передать хэндл мютекса?

Не сильно понятно вы выразились.

ПыСы: короче я понял, что хэндл передавать смысла нету. Так что сделаю с именем. А вот вопрос по поводу строк и ERROR_ACCESS_DENIED остается открытым...

Последний раз редактировалось MaTBeu; 25.11.2008 в 22:46.
MaTBeu вне форума Ответить с цитированием
Старый 25.11.2008, 23:17   #7
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Можно разрешить наследовать хэндлы и передать хэндл через командную строку, если действительно именно так надо. Но лучше передавать имя.
Somebody вне форума Ответить с цитированием
Старый 26.11.2008, 17:50   #8
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

насчёт строк:
Код:
char m[] = "privet"; 	

LPSTR lpCmd = new char[20];
strcpy(lpCmd, m); 

MessageBox(0,lpCmd,lpCmd,0);
всё нормально
rpy3uH вне форума Ответить с цитированием
Старый 26.11.2008, 21:55   #9
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

2rpy3uH
Да, я к этому выводу тоже пришел. Только вот если парсить командную строку на слова, то присвоить ее так не получиться.

Тоесть закинуть и передать эту строку выйдет, а вот на стороне "клиента" разбить ее на слова врядли получиться.
ПыСы:
Код:
LPSTR lpCmd = new char[20];
char lpMutexName[]		="Locker";	
char lpMapName[]		="Map";	
.....

strcpy(lpCmd, lpMutexName);
Не пашет. Ошибка та же -

Цитата:
Unhandled exception at 0x102aece9 (msvcr80d.dll) in Creator.exe: 0xC0000005: Access violation writing location 0x004189be.
А вот если вот так:
Код:
LPSTR lpCmd;	                                 //не выделяем память
LPVOID lpVoid			=NULL;
char lpMutexName[]		="Locker";	
char lpMapName[]		="Map";	
.....
lpCmd=(LPSTR)&lpVoid;                         //адрес 
strcpy(lpCmd, lpMutexName);
strcat(lpCmd, " ");
strcat(lpCmd, lpMapName);
strcat(lpCmd, "\0");
Не знаю почему, но работает.

Последний раз редактировалось MaTBeu; 26.11.2008 в 23:00.
MaTBeu вне форума Ответить с цитированием
Старый 29.11.2008, 15:30   #10
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Но в данном методе тоже есть недостаток. Если строк, в которые нужно писать несколько, то получается, что они будут находится по одному и тому же адресу, и при изменении одной, будут изменяться все.
MaTBeu вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача файла через TServerSocket и TClientSocket Vanya Работа с сетью в Delphi 10 08.04.2008 18:12
передача данных через idtcpclient BioS Работа с сетью в Delphi 0 20.02.2007 11:04
Передача данных(массива) через DLL. acorables Общие вопросы Delphi 4 05.02.2007 13:16