Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.25;
Скачать: CL | DM;

Вниз

Путь к исполняемому файлу   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.028 c
15-1170186746
hmmm
2007-01-30 22:52
2007.02.25
PHP +HTML :) не пинайте


2-1171029853
sat
2007-02-09 17:04
2007.02.25
DLL


2-1170924802
Alexdeil
2007-02-08 11:53
2007.02.25
Проблема с записью....


3-1165230091
kivadim
2006-12-04 14:01
2007.02.25
как отобразить юникодовские символы из базы в отчете FastReports


15-1170016567
i-am-vladko
2007-01-28 23:36
2007.02.25
Assembler