Большой Воронежский Форум

Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел.
Вернуться   Большой Воронежский Форум » Компьютеры и все, что с ними связано » » Программирование
Философия, технологии, алгоритмы!

Ответ
 
Опции темы
Старый 11.01.2005, 16:43   #1   
Серж
 
Сообщений: 232
Регистрация: 13.02.2004
Возраст: 42

serk вне форума Не в сети
Есть ли стандартное преобразование на С++типа...

Есть такая трабла ударился поюзать на визуале с++ апишную функцию CreateProcess. Так вот одним из ее параметров стоит соответственно файл который нуна юзать.Получаю с помощью стандартного диалога CFileDialog::Get...Name эту строку с путем и именем файла пишу в CSTring.Далее подставляю ее в криэте процесс и получаю шиш. Так вот и суть траблы может(чтобы заново не изобретать веллосипед, типа алгоритма подстановки в строку вторых символов "\") есть стандартный способ форматирования строк типа "c:\prog\my.exe" в "c:\\prog\\my.exe" или может это еще какнить прощще делается(я почемуто уверен что должно ).Подскажите если можите.
  Ответить с цитированием
Старый 11.01.2005, 21:22   #2   
it debil
 
Аватар для Zexes[LT]
 
Сообщений: 1,578
Регистрация: 24.03.2003
Возраст: 36

Zexes[LT] вне форума Не в сети
В силу своей ламерности делаю дедовским способом:
WinExec(strPathToPrg,SW_SHOW);
И нет проблем с \
  Ответить с цитированием
Старый 11.01.2005, 21:58   #3   
Серж
 
Сообщений: 232
Регистрация: 13.02.2004
Возраст: 42

serk вне форума Не в сети
Ну дыкть и мы такс умеем вот тока нуна будет потомочи проследить жизненный цикл этой проги вплоть до ее завершения. И еще в энто время нуна научиться параллельно с например частотой в минуту слать сообщения.Вот и диллема сначала запустить и следить за ее жизнью(это еще не так сложно)но вот как организовать парралельно с энтим работу проги без залипания на WaitForSingleObject.
  Ответить с цитированием
Старый 12.01.2005, 07:53   #4   
Форумец
 
Аватар для Spectator
 
Сообщений: 39,918
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
когда ты в коде пишешь "c:\\prog\\my.exe"
то в памяти программы получаешь "c:\prog\my.exe"
так что стандартная функция есть - это компилер
а что за шиш ты получаешь - подробнее надо говорить
шиши они разные бывают
  Ответить с цитированием
Старый 12.01.2005, 22:46   #5   
Серж
 
Сообщений: 232
Регистрация: 13.02.2004
Возраст: 42

serk вне форума Не в сети
Spectator
Понял объясняю получаю имя и путь к файлу через вызов CFileDialog:oModal далее вынимаю оттдуда присваиванием типа
CString m_strFileName=dlg.GetPathName();
далее
CreateProcess(NULL,
(LPTSTR)&m_strFileName,//эта строка не работает
//"C:\\Program Files\\Cpuz\\cpuz.exe",//эта работает прекрасно
NULL,
NULL,
FALSE,
CREATE_DEFAULT_ERROR_MODE|NORMAL_PRIORITY_CLASS,
NULL,
NULL,
&si,
&pi)
Тепереча надеюсь вопрос вроде корректно задан.Что в данном случае делать то со строкой как может еще нужно было сделать.
Да и заодно второй вопрос может кто делал так:этот проц не только запустить нужно но и проследить когда он скажет пока(WM_QUIT) все это время пока он работает нужно еще в проге действия некоторые производить.
  Ответить с цитированием
Старый 13.01.2005, 18:42   #6   
Registered User
 
Сообщений: 67
Регистрация: 08.07.2003
Возраст: 43

Fisher вне форума Не в сети
Цитата:
CreateProcess(NULL,
(LPTSTR)&m_strFileName,//эта строка не работает
Не строка это вовсе. Никто не обещал, что внутренний буфер CString находится вначале. Здесь нужно было написать m_strFileName.GetBuffer() (возвращает неконстантную строку).

Цитата:
//"C:\\Program Files\\Cpuz\\cpuz.exe",//эта работает прекрасно
Это повезло, что работает. Вторым аргументом к этой функции должна быть неконстантная строка (CreateProcess ее модифицирует).

Цитата:
Да и заодно второй вопрос может кто делал так:этот проц не только запустить нужно но и проследить когда он скажет пока(WM_QUIT) все это время пока он работает нужно еще в проге действия некоторые производить.
Создаешь отдельную нить, в которой будешь запускать процесс:

//
DWORD dwThreadID;

HANDLE hThread = CreateThread(NULL, 0, proc_start_thread, (PVOID) &listenWndHandle, 0, &dwThreadId);

//


DWORD WINAPI proc_start_thread(LPVOID args)
{
HWND listenWnd = *((HWND*)args);
PROCESS_INFORMATION pi;
DWORD dwExitCode;

BOOL success = CreateProcess(..., &pi);
if (success) {
CloseHandle(pi.hThread);

WaitForSingleObject(pi.hProcess, INFINITE);

GetExitCodeProcess(pi.hProcess, &dwExitCode);
CloseHandle(pi.hProcess);

PostMessage(listenWnd, WM_MYAPP_PROC_FINISHED);

}
}
  Ответить с цитированием
Старый 14.01.2005, 09:06   #7   
Форумец
 
Аватар для Spectator
 
Сообщений: 39,918
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
>Не строка это вовсе. Никто не обещал, что внутренний >буфер CString находится вначале. Здесь нужно было >написать m_strFileName.GetBuffer() (возвращает >неконстантную строку).

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

нужно вызвать функцию c_str().
кроме того:
BOOL CreateProcess(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
то есть CreateProcess не изменяет appName - да и с чего-бы.
  Ответить с цитированием
Старый 14.01.2005, 11:17   #8   
Registered User
 
Сообщений: 67
Регистрация: 08.07.2003
Возраст: 43

Fisher вне форума Не в сети
Цитата:
Не совсем так - буфер действительно возвратит
Нет, буфер ничего не возвращает, буфер - это область памяти.
Цитата:
ссылку на собственно строку
А вот член-функция CString::GetBuffer() возвращает, но не ссылку, а указатель на начало области памяти упомянутой выше.
Цитата:
но потом его надо будет закрыть - то есть эта функция берет буфер на запись. Его нужно будет потом закрыть.
С этой задачей CString самостоятельно может справиться, так как размер строки не меняется.

Цитата:
нужно вызвать функцию c_str().
А что это за функция? Если имелась в виду функция std::string::c_str(), то она тут не применима, т.к. возвращает указатель на константную строку.

Цитата:
кроме того:
BOOL CreateProcess(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
то есть CreateProcess не изменяет appName - да и с чего-бы. [/B]
Здесь никто и не писал, что CreateProcess изменяется свой первый аргумент. Я говорил о втором аргументе. Система изменяет буфер, записывая ноль между именем файла и аргументами, чтобы получить две строки для внутреннго пользования. По завершении работы, функция восстанавливает буфер.
Впрочем за подробностями можно обратиться к PSDK.
  Ответить с цитированием
Старый 14.01.2005, 17:10   #9   
Форумец
 
Аватар для andr
 
Сообщений: 608
Регистрация: 20.09.2004
Возраст: 43

andr вне форума Не в сети
CreateProcess ( CString, CString.GetBuffer(500например), .... )
и все будет ...
  Ответить с цитированием
Старый 14.01.2005, 17:24   #10   
Серж
 
Сообщений: 232
Регистрация: 13.02.2004
Возраст: 42

serk вне форума Не в сети
Fisher Пасиб за ответ.Я уже немного по другому подошел к вопросу взятия имени и пути файла через GetOpenFileName она просто сразу возратила то что мне нуна. Ну а с преобразованиями у меня пожизненная запарка как во что нить упрусь так блин ничем меня не сдвинеш.
Вот и еще к тебе тодыть впросик как раз по тому как ты подсказал создать нить для запуска и слежения за состоянием приложения. Эта нить не завесит всю прогу до завершения приложения или же этот процесс просто повиснет до завершения WaitForSingleObject(pi.hProcess, INFINITE);а моя основная прога будет себя чувствовать изюмительно.
  Ответить с цитированием
Старый 14.01.2005, 18:05   #11   
Registered User
 
Сообщений: 67
Регистрация: 08.07.2003
Возраст: 43

Fisher вне форума Не в сети
Цитата:
Эта нить не завесит всю прогу до завершения приложения или же этот процесс просто повиснет до завершения WaitForSingleObject(pi.hProcess, INFINITE);а моя основная прога будет себя чувствовать изюмительно. [/B]
Пока состояние объекта pi.hProcess не перейдет в состояние signaled, эта нить перейдет состояние wait, и не будет использовать процессорное время. Коротко говоря, все будет изумительно.
  Ответить с цитированием
Старый 15.01.2005, 09:19   #12   
Форумец
 
Аватар для Spectator
 
Сообщений: 39,918
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
Цитата:
Первоначальное сообщение от Fisher
Нет, буфер ничего не возвращает, буфер - это область памяти.

А вот член-функция CString::GetBuffer() возвращает, но не ссылку, а указатель на начало области памяти упомянутой выше.
Не надо умничать - ссылка и указатель - это одно и то же.

Цитата:

С этой задачей CString самостоятельно может справиться, так как размер строки не меняется.
Не может - если ты захватил буфер - ты ДОЛЖЕН его освободить.

Цитата:

А что это за функция? Если имелась в виду функция std::string::c_str(), то она тут не применима, т.к. возвращает указатель на константную строку.
Я точно не помню названия функции, но нужен именно константный указатель.

Цитата:

Здесь никто и не писал, что CreateProcess изменяется свой первый аргумент. Я говорил о втором аргументе. Система изменяет буфер, записывая ноль между именем файла и аргументами, чтобы получить две строки для внутреннго пользования. По завершении работы, функция восстанавливает буфер.
Впрочем за подробностями можно обратиться к PSDK.
Извини, но я не понял, что ты хотел сказать. Если функция изменяет аргумент, то она его изменяет, а так чтобы изменяет, а потом обратно вертает - это фантастика.

P.S. между именем файла и аргументами - это запятая?
  Ответить с цитированием
Старый 15.01.2005, 12:38   #13   
Registered User
 
Сообщений: 67
Регистрация: 08.07.2003
Возраст: 43

Fisher вне форума Не в сети
Цитата:
Не надо умничать - ссылка и указатель - это одно и то же.
Давай договоримся, в поле какого языка мы разговариваем. Для чего это
нужно: например в языке С нет ссылок, а в языке Java нет указателей.
Итак, мы говорим о С++. В С++ ссылка является альтернативным именем
объекта. Вот несколько примеров явного отличия ссылок перед
указателями: ссылки обязательно должны быть инициализированы
(указатели - нет), не существует ссылок на ссылки (указатели на
указатели - рядовой случай), нельзя заставить ссылку ссылаться на другой объект.
Думаю, уже становится очевидным, что ссылки и указатели в С++ - две разные сущности.

Цитата:
Не может - если ты захватил буфер - ты ДОЛЖЕН его освободить.
Спорить тут явно бесполезно. Ни ты, ни я этот класс не писали. Но вот,
что пишут разработчики этого класса: The buffer is not reallocated if you do not change the length of the CSimpleStringT.
The buffer memory is automatically freed when the CSimpleStringT object is destroyed.


Цитата:
Я точно не помню названия функции, но нужен именно константный
указатель.
Для чего нужен именно он? Ты описание CreateProcess в PSDK читал? "The
Unicode version of this function, CreateProcessW, will fail if this
parameter is a const string." Ansi-версия не упадет только потому, что
создается unicode-копия строки и уже она передается в CreateProcessW.

Цитата:
Извини, но я не понял, что ты хотел сказать. Если функция изменяет аргумент, то она его изменяет, а так чтобы изменяет, а потом обратно вертает - это фантастика.
P.S. между именем файла и аргументами - это запятая?

Читайте мат.часть.
The system adds a null character to the command line string to
separate the file name from the arguments. This divides the original
string into two strings for internal processing.

Ликбез окончен.
  Ответить с цитированием
Старый 15.01.2005, 16:41   #14   
Серж
 
Сообщений: 232
Регистрация: 13.02.2004
Возраст: 42

serk вне форума Не в сети
Fisher Спасибо за консультацию.Пока еще не использовал но в ближайшие дни буду ваять код тодыть и проверю.
  Ответить с цитированием
Поиск в теме: 



Быстрый переход:

  Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Support by DrIQ & Netwind