Форум: "Основная";
Текущий архив: 2007.02.25;
Скачать: [xml.tar.bz2];
ВнизПуть к исполняемому файлу Найти похожие ветки
← →
lookin © (2007-01-03 22:07) [0]Какие существуют WinAPI-способы получить путь к исполняемому файлу (exe или dll) в пределах той части кода, которая соответствует инициализации приложения, кроме GetModuleFileName? Спасибо.
← →
tesseract © (2007-01-03 22:15) [1]к exe можно, например ExePath:=Application.exename
← →
tesseract © (2007-01-03 22:19) [2]WinApi смотри argv[0].
← →
lookin © (2007-01-03 22:49) [3]>>tesseract
Опишу точнее проблему. Есть некая программа, которая, используя некое системное ядро, запускает приложение (сишное). Вот функция этого ядра:
function hkStartApplication(HyperKernelExe: PChar; DbgHWnd: HWND): LongInt; stdcall;
HyperKernelExe - командная строка для запуска приложения
DbgHWnd - контрол для получения сообщений, выдаваемых ядром
А вот main сишной программы:
int main(int argc, char* argv[])
{
}
Если записать
s:=ExecutableFile;
if hkStartApplication(PChar(s),lst.handle) then ...
то запуск успешно выполняется. Но если записать что-то в духе
s:=ExecutableFile+" "+SomeParameter;
if hkStartApplication(PChar(s),lst.handle) then ...
то запуск виснет.
Но это, впрочем, не так важно. Важно то, что если в теле main сишной программы я пишу следующее:
HINSTANCE h;
char exefilename[MAX_PATH];
char inifilename[MAX_PATH];
int n,fileid;
char *inifilestring=" ";
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";
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);
}
то запуск тем более виснет. Вот поэтому ищу другие способы получения пути исполняемого файла...
PS Полагаю, из кода ясно, что хочется в сишную программу из запускающей программы передать некий параметр.
← →
tesseract © (2007-01-03 22:56) [4]А память под переменные выделить?
← →
lookin © (2007-01-03 22:57) [5]Естественно, выделено...
← →
tesseract © (2007-01-03 23:14) [6]не вижу в коде, проверь отладчиком, не забываем про С-шный прикол с двумя слэшами вместо одного.
← →
lookin © (2007-01-03 23:49) [7]>>tesseract
Все в порядке отлажено...
← →
lookin © (2007-01-03 23:50) [8]Но проблема не изчезает... Да и не исчезнет, поскольку ядро поганое оченно вроде бы как бы чувствительно ко всяким штучкам...
← →
MetalFan_pda (2007-01-04 15:47) [9]а причем тут делфи?
← →
Чапаев © (2007-01-04 23:27) [10]> [8] lookin © (03.01.07 23:50)
PSAPI смотри... Только судя по приведенному коду, tesseract прав: память не выделена.
← →
lookin © (2007-01-06 20:07) [11]>>tesseract
>>Чапаев
Так, погодите-ка. Поподробнее, если можно, какую память надо выделять и под что?
← →
Чапаев © (2007-01-06 22:43) [12]Например, 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%, что именно такой вариант скомпилится, но можно сделать проще, чем у тебя.
← →
Чапаев © (2007-01-06 22:53) [13]Да, кстати. А
> function hkStartApplication(HyperKernelExe: PChar; DbgHWnd:
> HWND): LongInt; stdcall;
> HyperKernelExe - командная строка для запуска приложения
> DbgHWnd - контрол для получения сообщений, выдаваемых ядром
вообще в принципе умеет запускать приложение с заданными параметрами? Как-то имя параметра HyperKernelExe наводит на мысль не о командной строке, а об имени исполняемого файла.
← →
lookin © (2007-01-06 23:25) [14]>>Чапаев
Давай по порядочку отвечу...
>>Например, 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 23:43) [15]> Просто я использовал одну и ту же переменную для задания
> имени файла и для чтения из строки...
Разные, судя по приведенному коду. И вот той, что ты написал в примере, выделен один байт.
> читай - 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() посмотри ещё.
← →
GrayFace © (2007-01-07 00:16) [16]> lookin © (06.01.07 23:25) [14]
> Так устроена эта функция, что чтение производится в inifilestring,
> это уже не имя ini-файла, просто строковый буфер. Перед
> этим выполняется открытие файла hkOpen(inifilename,READWRITE_FILE).
> Просто я использовал одну и ту же переменную для задания
> имени файла и для чтения из строки...
Тогда какой-нибудьinifilestring = inifilename
должен быть (илиinifilestring = &inifilename
- тоже не силен в С).
← →
lookin © (2007-01-07 00:26) [17][15] Чапаев © (06.01.07 23:43)
Пусть даже так, похоже, это верное замечание... Однако программа валится еще до прихода туда. Более того, просто комментирую все, кроме
h = GetModuleHandle(NULL);
GetModuleFileName(h,exefilename,MAX_PATH);
И все равно висит...
GetCommandLine - спасибо, посмотрю. (Сейчас не могу, так как HyperKernel не любит сеть)))
← →
Чапаев © (2007-01-07 00:47) [18]> [17] lookin © (07.01.07 00:26)
Ты мне на [13] ответь. Уверен?
← →
lookin © (2007-01-07 01:50) [19][18] Чапаев © (07.01.07 00:47)
Уверен настолько, насколько строка типа "C:\exefile parA parB" или "C:\exefile /parA /parB" является строкой с параметрами...
← →
школьник :-) (2007-01-07 02:41) [20]
> 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 02:45) [21][20] школьник :-) (07.01.07 02:41)
Вообще то я
char inifilename[MAX_PATH];
а не
char *inifilestring=" ";
Насчет того, что все работает. Все и так работает, что в билдере, что в Visual Си. Одно лишь мешает - ничего не работает при вызове из под HyperKernel...
>>К сожалению в справке по билдеру нет
Конечно, ведь это HyperKernelовские фукнции...
← →
школьник :-) (2007-01-07 14:00) [22]
> lookin © (07.01.07 02:45) [21]
ну не знаю, как так получается, но вот исходник из
> lookin © (03.01.07 22:49) [3]
> char *inifilestring=" ";
← →
lookin © (2007-01-08 09:24) [23]Да, перепутал inifilename с inifilestring. А про то, что в char *inifilestring=" " больше одного байта нельзя писать - этого я не знал. Спасибо.
← →
школьник :-) (2007-01-08 14:34) [24]
> А про то, что в char *inifilestring=" " больше одного байта
> нельзя писать - этого я не знал.
общий смысл понять можно тут -
http://www.xakep.ru/magazine/xa/032/070/1.asp
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.02.25;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.048 c