![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Путь к исполняемому файлу
lookin © (2007-01-03 22:07:00)Какие существуют WinAPI-способы получить путь к исполняемому файлу (exe или dll) в пределах той части кода, которая соответствует инициализации приложения, кроме GetModuleFileName? Спасибо.
школьник :-) (2007-01-08 14:34:00) [1]
> А про то, что в char *inifilestring=" " больше одного байта
> нельзя писать - этого я не знал.
общий смысл понять можно тут -
http://www.xakep.ru/magazine/xa/032/070/1.asp
lookin (2007-01-08 09:24:00) [2]Да, перепутал inifilename с inifilestring. А про то, что в char *inifilestring=" " больше одного байта нельзя писать - этого я не знал. Спасибо.
школьник :-) (2007-01-07 14:00:00) [3]
> lookin © (07.01.07 02:45) [21]
ну не знаю, как так получается, но вот исходник из
> lookin © (03.01.07 22:49) [3]
> char *inifilestring=" ";
lookin (2007-01-07 02:45:00) [4][20] школьник :-) (07.01.07 02:41)
Вообще то я
char inifilename[MAX_PATH];
а не
char *inifilestring=" ";
Насчет того, что все работает. Все и так работает, что в билдере, что в Visual Си. Одно лишь мешает - ничего не работает при вызове из под HyperKernel...
>>К сожалению в справке по билдеру нет
Конечно, ведь это HyperKernelовские фукнции...
школьник :-) (2007-01-07 02:41:00) [5]
> lookin © (03.01.07 22:49) [3]
char *inifilestring=" ";
писать в это больше одного байта нельзя.
ставь
char inifilestring[MAX_PATH];
или
char *inifilestring = new char [MAX_PATH];
...
delete [] inifilestring;
все должно работать.
кстати, а что за среда?
в C++ Builder 6 (Form+Button+Edit )такой код:
#define MAX_PATH 1024
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HINSTANCE h;
char exefilename[MAX_PATH];
char inifilename[MAX_PATH];
int n,fileid;
char *inifilestring = new char [MAX_PATH];
h = GetModuleHandle(NULL);
GetModuleFileName(h,exefilename,MAX_PATH);
n = strlen(exefilename);
strncpy(inifilename,exefilename,n-3);
inifilename[n-3] = '\0';
strcat(inifilename,"ini");
n = strlen(inifilename);
inifilename[n] = '\0';
Edit1->Text = inifilename;
delete [] inifilestring;
}
у меня прекрасно работал, выдал такой результат
D:\Áîëüøàÿ ñâàëêà\Codding_test\run_str\Project1.ini
К сожалению в справке по билдеру нет ничего про функции, которые ты используешь в этом куске кода:
fileid=hkOpen(inifilename,READWRITE_FILE);
if (fileid==0)
hkDebug("Can't open INI-file");
else
{
hkDebug("INI-file has been successfully opened");
hkReadString(inifilestring,8,fileid);
hkReadString(inifilestring,8,fileid);
PORT = atoi(inifilestring);
hkClose(fileid);
}
lookin (2007-01-07 01:50:00) [6][18] Чапаев © (07.01.07 00:47)
Уверен настолько, насколько строка типа "C:\exefile parA parB" или "C:\exefile /parA /parB" является строкой с параметрами...
Чапаев (2007-01-07 00:47:00) [7]> [17] lookin © (07.01.07 00:26)
Ты мне на [13] ответь. Уверен?
lookin (2007-01-07 00:26:00) [8][15] Чапаев © (06.01.07 23:43)
Пусть даже так, похоже, это верное замечание... Однако программа валится еще до прихода туда. Более того, просто комментирую все, кроме
h = GetModuleHandle(NULL);
GetModuleFileName(h,exefilename,MAX_PATH);
И все равно висит...
GetCommandLine - спасибо, посмотрю. (Сейчас не могу, так как HyperKernel не любит сеть)))
GrayFace (2007-01-07 00:16:00) [9]> lookin © (06.01.07 23:25) [14]
> Так устроена эта функция, что чтение производится в inifilestring,
> это уже не имя ini-файла, просто строковый буфер. Перед
> этим выполняется открытие файла hkOpen(inifilename,READWRITE_FILE).
> Просто я использовал одну и ту же переменную для задания
> имени файла и для чтения из строки...
Тогда какой-нибудьinifilestring = inifilenameдолжен быть (илиinifilestring = &inifilename- тоже не силен в С).
Чапаев (2007-01-06 23:43:00) [10]> Просто я использовал одну и ту же переменную для задания
> имени файла и для чтения из строки...
Разные, судя по приведенному коду. И вот той, что ты написал в примере, выделен один байт.
> читай - MSDN, которого у меня нету
Будешь смеяться, но у меня сейчас тоже его нет. ;-)
> h = GetModuleHandle(NULL);
> GetModuleFileName(h,exefilename,MAX_PATH);
Зачем? GetModuleFileName: hModule
[in] Handle to the module whose path is being requested. If this parameter is NULL, GetModuleFileName retrieves the path for the current module.
GetCommandLine() посмотри ещё.
lookin (2007-01-06 23:25:00) [11]>>Чапаев
Давай по порядочку отвечу...
>>Например, hkReadString(inifilestring,8,fileid); -- читаешь (вроде) 8 байт в переменную,
>>под которую один байт выделен.
Так устроена эта функция, что чтение производится в inifilestring, это уже не имя ini-файла, просто строковый буфер. Перед этим выполняется открытие файла hkOpen(inifilename,READWRITE_FILE). Просто я использовал одну и ту же переменную для задания имени файла и для чтения из строки...
>>Почему не n=GetModuleFileName(h,exefilename,MAX_PATH);?
и
>>Тоже мудрёно очень. Почему не
Ну, это из-за моего неумения работать в Си и совершенного отсутствия помощи (читай - MSDN, которого у меня нету). Все вышеописанное в Си и так мне досталось спустя час усиленной работы и поисков в инете)).
>>вообще в принципе умеет запускать приложение с заданными параметрами?
Вот как раз похоже, что нет... Так или иначе, пробовал с параметрами, ничего не вышло...
PS Для меня гораздо любопытнее, почему при выполнении куска
h = GetModuleHandle(NULL);
GetModuleFileName(h,exefilename,MAX_PATH);
сишная программа виснет...
Чапаев (2007-01-06 22:53:00) [12]Да, кстати. А
> function hkStartApplication(HyperKernelExe: PChar; DbgHWnd:
> HWND): LongInt; stdcall;
> HyperKernelExe - командная строка для запуска приложения
> DbgHWnd - контрол для получения сообщений, выдаваемых ядром
вообще в принципе умеет запускать приложение с заданными параметрами? Как-то имя параметра HyperKernelExe наводит на мысль не о командной строке, а об имени исполняемого файла.
Чапаев (2007-01-06 22:43:00) [13]Например, hkReadString(inifilestring,8,fileid); -- читаешь (вроде) 8 байт в переменную, под которую один байт выделен.
> GetModuleFileName(h,exefilename,MAX_PATH);
> n = strlen(exefilename);
Зачем? Почему не n=GetModuleFileName(h,exefilename,MAX_PATH);?
> strncpy(inifilename,exefilename,n-3);
> inifilename[n-3] = '\0';
> strcat(inifilename,"ini");
> n = strlen(inifilename);
> inifilename[n] = '\0';
Тоже мудрёно очень. Почему не
strncpy(inifilename,exefilename,n-3);
strncpy(&inifilename[n-3],"ini",3);
inifilename[n] = '\0';
? Не уверен на 100%, что именно такой вариант скомпилится, но можно сделать проще, чем у тебя.
lookin (2007-01-06 20:07:00) [14]>>tesseract
>>Чапаев
Так, погодите-ка. Поподробнее, если можно, какую память надо выделять и под что?
Чапаев (2007-01-04 23:27:00) [15]> [8] lookin © (03.01.07 23:50)
PSAPI смотри... Только судя по приведенному коду, tesseract прав: память не выделена.
MetalFan_pda (2007-01-04 15:47:00) [16]а причем тут делфи?
lookin (2007-01-03 23:50:00) [17]Но проблема не изчезает... Да и не исчезнет, поскольку ядро поганое оченно вроде бы как бы чувствительно ко всяким штучкам...
lookin (2007-01-03 23:49:00) [18]>>tesseract
Все в порядке отлажено...
tesseract (2007-01-03 23:14:00) [19]не вижу в коде, проверь отладчиком, не забываем про С-шный прикол с двумя слэшами вместо одного.
lookin (2007-01-03 22:57:00) [20]Естественно, выделено...