Переименование программы или ее рабочего каталога меняет поведение?
Это определенно самая странная ошибка, с которой я долго бился головой...
У меня очень простой.exe на Windows 10, который я скомпилировал сам, используя MSVC и библиотеку Allegro (которая использует DirectX). Источник ниже на случай, если детали как-то важны, но суть:
- DirectDraw выдает ошибку времени выполнения, когда я запускаю код.
- Если я переименую исполняемый файл, ошибка исчезнет, и программа будет успешно выполнена.
- Если я переместу исполняемый файл в другую папку или переименую папку, программа запустится успешно.
- Если я переименую исполняемый файл / папку обратно в их исходные имена, ошибка вернется.
В папке нет других файлов. Единственное, о чем я могу думать, это то, что Windows каким-то образом ищет абсолютный путь к исполняемому файлу и ведет себя по-разному в зависимости от этого значения (кэширование некоторой информации о совместимости?)
Есть идеи, что происходит? На практике я могу просто переименовать исполняемый файл и продолжить свой день, но теперь мне действительно интересно, почему происходит такое поведение...
PS: код точно такой, используя библиотеку Allegro 4.4.
#include "allegro.h"
int main(int argc, char **argv)
{
allegro_init();
set_color_depth(8);
set_gfx_mode(GFX_AUTODETECT_FULLSCREEN, 640, 480, 0, 0);
exit(0);
}
END_OF_MAIN()
Когда я запускаю код, я получаю сообщение об ошибке (E_NOIMPL) при попытке установить режим видео.
1 ответ
Вы должны знать, что Windows хранит полный путь к программе в реестре или на рабочем столе. Если вы измените название программы или каталога, вам необходимо выполнить поиск в реестре по названию программы.
Одно место, на которое стоит обратить внимание, - это приложение APPPATHS, где вы можете создавать ярлыки для нужной программы. Вы создаете копию write.exe и заменяете строку в ней (wordpad.exe) на имя, которое не используется (например, zdirectx.exe), и создаете запись в реестре apppath, которая будет запускаться. directx.exe
когда ты звонишь zdirectx.exe
, Затем вы можете позвонить в вашу программу directx.exe
тоже.
Я использую эту технику, чтобы перемещать многие программные компоненты по пути, сохраняя доступность программы.