Получить имя папки, где находится запущенный dll-файл

Автор Тема: Получить имя папки, где находится запущенный dll-файл  (Прочитано 25573 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
И все это безобразие только если загружать эту библиотеку макросом с палитры

    ^C^C_NETLOAD "C://ACAD_DLL//_AddMLeader//AddMLeader_2014.dll";bx_addmleader;


Если загрузить руками и запустить команду руками, то все тип топ. Работает как часы.
А чего это у тебя двойные прямые слэши? Двойные только обратные должны быть.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Лучше их комментить. Зачем они? В любом случае, FileStream нужно "заворачивать" в using.
Только для тог, что бы проверит что этот файл нормально читается... это тестовая строка.

А чего это у тебя двойные прямы слэши? Двойные только обратные должны быть.
А Вы попробуйте, так как у меня написано - работает, а если с обратными, то нет.

Огромное спасибо Андрею. Сам дурак. Программку начал писать давно, один класс полностью отработал, отладил и забыл про него. Забыл, что в этом классе обращаюсь к xml файлу и там прописан относительный путь от текущего. Изменил на абсолютный и теперь все нормально.
ЗЫ.
Внимательнее нужно быть и писать код один раз...

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
А Вы попробуйте, так как у меня написано - работает, а если с обратными, то нет.
Разницу между одиночными (один слэш) и двойными (два слэша) чувствуешь?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Разницу между одиночными (один слэш) и двойными (два слэша) чувствуешь?
Угу.
Голова совсем не варит к вечеру, да так
Код - Auto/Visual Lisp [Выбрать]
  1. ^C^C_NETLOAD "C:/ACAD_DLL/_AddMLeader/AddMLeader_2014.dll";
работает.
Есть принципиальная разница между этими записями?
Код - Auto/Visual Lisp [Выбрать]
  1. ^C^C_NETLOAD "C://ACAD_DLL//_AddMLeader//AddMLeader_2014.dll";
  2. ^C^C_NETLOAD "C:/ACAD_DLL/_AddMLeader/AddMLeader_2014.dll";
и то и то грузит dll, какие подводные камни?

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Boxa.Shu, что-то странное... По идее надо либо c:\\acad_dll\\... либо c:/acad_dll/
Но чтобы работало только так, как у тебя написано - впервые вижу.
---
Добавлено:
пока писал ответ, предыдущий пост был подправлен.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
и то и то грузит dll, какие подводные камни?
Какие именно - не знаю. Но боком выйти может. Есть правила, которые следует соблюдать, если не хочешь получить "нежданку". :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Какие именно - не знаю. Но боком выйти может.
В виду того, что ObjectARX написан на C++, то возможно будет интересно, опубликованное ниже (набросал пример на коленках), поскольку к нему [ObjectARX] это полностью применимо (комментарии должны быть понятны).

Примечание: особым образом хотелось бы обратить внимание на результаты вызова GetFullPathName, в зависимости от того, как был указан перед этим параметр в вызове функции SetCurrentDirectory - с указанием суффикса "\\" или без... Это я к тому, что порой наличие казалось бы безобидных обратных слешей может давать не тот результат, который возможно ожидался.

Код - C++ [Выбрать]
  1.    /*
  2.   The system keeps track of the process' current drive and directory, but it
  3.   does not keep track of the current directory for every drive. However, there
  4.   is some operating system support for handling current directories for
  5.   multiple drives. This support is offered via the process' environment
  6.   strings. For example, a process can have two environment variables, as shown
  7.   here:
  8.  
  9.     =C:=C:\Utility\Bin
  10.     =D:=D:\Program Files
  11.  
  12.   These variables indicate that the process' current directory for drive C is
  13.   \Utility\Bin and that its current directory for drive D is \Program Files.
  14.  
  15.   If you call a function, passing a drive-qualified name indicating a drive
  16.   that is not the current drive, the system looks in the process' environment
  17.   block for the variable associated with the specified drive letter. If the
  18.   variable for the drive exists, the system uses the variable's value as the
  19.   current directory. If the variable does not exist, the system assumes that
  20.   the current directory for the specified drive is its root directory.
  21.  
  22.   For example, if your process' current directory is C:\Utility\Bin and you
  23.   call CreateFile to open D:ReadMe.Txt, the system looks up the environment
  24.   variable =D:. Because the =D: variable exists, the system attempts to open
  25.   the ReadMe.Txt file from the D:\Program Files directory. If the =D: variable
  26.   did not exist, the system would attempt to open the ReadMe.Txt file from the
  27.   root directory of drive D. The Windows file functions never add or change a
  28.   drive-letter environment variable—they only read the variables.
  29.  
  30.   NOTE  
  31.   You can use the C run-time function _chdir or _wchdir instead of the Windows
  32.   SetCurrentDirectory function to change the current directory. The _chdir and
  33.   _wchdir function call SetCurrentDirectory internally, but _chdir also adds
  34.   or modifies the environment variables by calling SetEnvironmentVariable so
  35.   that the current directory of different drives is preserved.
  36.   */
  37.  
  38.   // There the sample of switching for different cases (current EXE file is
  39.   // located in the "D:\projects\richter-console" directory):
  40.  
  41.   TCHAR szCurDir[MAX_PATH];
  42.  
  43.   /* szCurDir has the C:\ */
  44.   DWORD cchLength = GetFullPathName(TEXT("C:"), MAX_PATH, szCurDir, NULL);
  45.  
  46.   // change the value of the CURRENT DIRECTORY OF DISK C:
  47.   SetEnvironmentVariable(TEXT("=C:"), TEXT("C:\\Temp\\sandbox"));
  48.  
  49.   // szCurDir has the C:\\Temp\\sandbox
  50.   cchLength = GetFullPathName(TEXT("C:"), MAX_PATH, szCurDir, NULL);
  51.  
  52.   // Set the disk without the \\ suffix
  53.   SetCurrentDirectory(TEXT("D:"));
  54.  
  55.   // szCurDir has the C:\Temp\sandbox
  56.   cchLength = GetFullPathName(TEXT("C:"), MAX_PATH, szCurDir, NULL);
  57.  
  58.   // szCurDir has the D:\projects\richter-console
  59.   cchLength = GetFullPathName(TEXT("D:"), MAX_PATH, szCurDir, NULL);
  60.  
  61.   // Set the disk without the \\ suffix
  62.   SetCurrentDirectory(TEXT("C:"));
  63.  
  64.   // szCurDir has the C:\Temp\sandbox
  65.   cchLength = GetFullPathName(TEXT("C:"), MAX_PATH, szCurDir, NULL);
  66.  
  67.   // Set the disk without the \\ suffix
  68.   _wchdir(TEXT("D:"));
  69.  
  70.   /* szCurDir has the D:\ */
  71.   cchLength = GetFullPathName(TEXT("D:"), MAX_PATH, szCurDir, NULL);
  72.  
  73.   // Set the disk with the \\ suffix
  74.   _wchdir(TEXT("D:\\"));
  75.  
  76.   /* szCurDir has the D:\ */
  77.   cchLength = GetFullPathName(TEXT("D:"), MAX_PATH, szCurDir, NULL);
  78.  
  79.   // change the value of the CURRENT DIRECTORY OF DISK D:
  80.   SetEnvironmentVariable(TEXT("=D:"), TEXT("D:\\SDK\\Autodesk"));
  81.  
  82.   // Warning: switch to other disk before the next calling of the
  83.   // GetFullPathName function
  84.   SetCurrentDirectory(TEXT("C:"));
  85.  
  86.   // szCurDir has the D:\SDK\Autodesk
  87.   cchLength = GetFullPathName(TEXT("D:"), MAX_PATH, szCurDir, NULL);
  88.  
  89.   // Set the disk with the \\ suffix
  90.   SetCurrentDirectory(TEXT("C:\\"));
  91.  
  92.   /* szCurDir has the C:\ */
  93.   cchLength = GetFullPathName(TEXT("C:"), MAX_PATH, szCurDir, NULL);