Это определенно самая странная ошибка, с которой я долго бился головой ...

У меня очень простой .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 ответ1

0

Вы должны знать, что windows хранит полный путь к программе в реестре или на рабочем столе. Если вы измените название программы или каталога, вам нужно найти в реестре название программы.

Одно место, на которое стоит обратить внимание, - это приложение APPPATHS, где вы можете создавать ярлыки для нужной программы. Вы делаете копию write.exe и заменяете строку в ней (wordpad.exe) на имя, которое не используется (например, zdirectx.exe), и создаете запись в реестре apppath, которая будет запускать directx.exe когда вы вызовите zdirectx.exe . Затем вы также можете вызвать вашу программу directx.exe .

Я использую эту технику, чтобы перемещать многие программные компоненты по пути, сохраняя доступность программы.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .