От: Anton "dmde@mail.primorye.ru" Кому: "kaev@yandex.ru" Тема: Может кому поможет Дата: 22 марта 2001 г. 7:00
Привет Артем. Пишу прогу на С и столкнулся с такой проблемой: Как узнать имя каталога, из которого запущен exe ?
Есть простая функция GetCurrentDirectiry(), но есть случаи когда она не срабатывает. Например, если программа запускается через ярлык и в ярлыке не проставлен рабочий каталог. А такое может случиться. Я нашел способ как это обойти /*перехожу с VB на VC, а в VB это просто свойсто объекта App*/ Возможно алгоритм не оптимален.
// execDlg.cpp : implementation file // #include "stdafx.h" #include "tlhelp32.h" CString DirName(); void CExecDlg::OnButton1() { m_List1.ResetContent(); CString str=""; str=DirName(); m_List1.AddString(str); } CString DirNameIt(char* exepath) { char *pdest; char string2[255]=""; int result; int ch = '\\'; // символ разделения пути pdest = strrchr( exepath, ch ); // ищем if( pdest != NULL ) { // если нашли, то берем только каталог. result = pdest - exepath ; strncpy( string2, exepath, result ); } else strcpy (string2, "Critical Error"); return string2; } CString DirName() { // Позаимствовал из шагов про сканирование процессов CString string=""; HANDLE hSnap; hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnap == NULL) { string = "Error Load ToolHelp"; } PROCESSENTRY32 proc; if (Process32First(hSnap, &proc)) { // если ID текущего процесса совпадет с ID сканируемого if (GetCurrentProcessId() == proc.th32ProcessID ) string = DirNameIt(proc.szExeFile); while (Process32Next(hSnap, &proc)) { if (GetCurrentProcessId()==proc.th32ProcessID) string = DirNameIt(proc.szExeFile); } } return string; }
С уважением. Антон.