Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
15-1170316596
DemoN__
2007-02-01 10:56
2007.02.25
Как проверить звуковуху


15-1170601901
#White#Wolf#
2007-02-04 18:11
2007.02.25
Пакеры


2-1170743971
Максименко
2007-02-06 09:39
2007.02.25
DateTimePicker


2-1170421186
Destroyer
2007-02-02 15:59
2007.02.25
Использование OnTerminate в TThread


2-1170485562
vegarulez
2007-02-03 09:52
2007.02.25
Как отловить нажатие кнопки?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский