Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Страницы:   1 2

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]

Естественно, выделено...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо