Большой Воронежский Форум
» Программирование>Есть ли стандартное преобразование на С++типа...
serk 16:43 11.01.2005
Есть такая трабла ударился поюзать на визуале с++ апишную функцию CreateProcess. Так вот одним из ее параметров стоит соответственно файл который нуна юзать.Получаю с помощью стандартного диалога CFileDialog::Get...Name эту строку с путем и именем файла пишу в CSTring.Далее подставляю ее в криэте процесс и получаю шиш. Так вот и суть траблы может(чтобы заново не изобретать веллосипед, типа алгоритма подстановки в строку вторых символов "\") есть стандартный способ форматирования строк типа "c:\prog\my.exe" в "c:\\prog\\my.exe" или может это еще какнить прощще делается(я почемуто уверен что должно ).Подскажите если можите. [Ответ]
Zexes[LT] 21:22 11.01.2005
В силу своей ламерности делаю дедовским способом:
WinExec(strPathToPrg,SW_SHOW);
И нет проблем с \ [Ответ]
serk 21:58 11.01.2005
Ну дыкть и мы такс умеем вот тока нуна будет потомочи проследить жизненный цикл этой проги вплоть до ее завершения. И еще в энто время нуна научиться параллельно с например частотой в минуту слать сообщения.Вот и диллема сначала запустить и следить за ее жизнью(это еще не так сложно)но вот как организовать парралельно с энтим работу проги без залипания на WaitForSingleObject. [Ответ]
Spectator 07:53 12.01.2005
когда ты в коде пишешь "c:\\prog\\my.exe"
то в памяти программы получаешь "c:\prog\my.exe"
так что стандартная функция есть - это компилер
а что за шиш ты получаешь - подробнее надо говорить
шиши они разные бывают
[Ответ]
serk 22:46 12.01.2005
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) все это время пока он работает нужно еще в проге действия некоторые производить.
[Ответ]
Fisher 18:42 13.01.2005

Сообщение от :
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);

}
} [Ответ]
Spectator 09:06 14.01.2005
>Не строка это вовсе. Никто не обещал, что внутренний >буфер 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 - да и с чего-бы. [Ответ]
Fisher 11:17 14.01.2005

Сообщение от :
Не совсем так - буфер действительно возвратит

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

Сообщение от :
ссылку на собственно строку

А вот член-функция 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. [Ответ]
andr 17:10 14.01.2005
CreateProcess ( CString, CString.GetBuffer(500например), .... )
и все будет ... [Ответ]
serk 17:24 14.01.2005
Fisher Пасиб за ответ.Я уже немного по другому подошел к вопросу взятия имени и пути файла через GetOpenFileName она просто сразу возратила то что мне нуна. Ну а с преобразованиями у меня пожизненная запарка как во что нить упрусь так блин ничем меня не сдвинеш.
Вот и еще к тебе тодыть впросик как раз по тому как ты подсказал создать нить для запуска и слежения за состоянием приложения. Эта нить не завесит всю прогу до завершения приложения или же этот процесс просто повиснет до завершения WaitForSingleObject(pi.hProcess, INFINITE);а моя основная прога будет себя чувствовать изюмительно. [Ответ]
Fisher 18:05 14.01.2005

Сообщение от :
Эта нить не завесит всю прогу до завершения приложения или же этот процесс просто повиснет до завершения WaitForSingleObject(pi.hProcess, INFINITE);а моя основная прога будет себя чувствовать изюмительно. [/B]

Пока состояние объекта pi.hProcess не перейдет в состояние signaled, эта нить перейдет состояние wait, и не будет использовать процессорное время. Коротко говоря, все будет изумительно. [Ответ]
Spectator 09:19 15.01.2005

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

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

Не надо умничать - ссылка и указатель - это одно и то же.

Сообщение от :

С этой задачей CString самостоятельно может справиться, так как размер строки не меняется.

Не может - если ты захватил буфер - ты ДОЛЖЕН его освободить.

Сообщение от :

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

Я точно не помню названия функции, но нужен именно константный указатель.

Сообщение от :

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

Извини, но я не понял, что ты хотел сказать. Если функция изменяет аргумент, то она его изменяет, а так чтобы изменяет, а потом обратно вертает - это фантастика.

P.S. между именем файла и аргументами - это запятая? [Ответ]
Fisher 12:38 15.01.2005

Сообщение от :
Не надо умничать - ссылка и указатель - это одно и то же.

Давай договоримся, в поле какого языка мы разговариваем. Для чего это
нужно: например в языке С нет ссылок, а в языке 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.

Ликбез окончен. [Ответ]
serk 16:41 15.01.2005
Fisher Спасибо за консультацию.Пока еще не использовал но в ближайшие дни буду ваять код тодыть и проверю. [Ответ]
Вверх