Получить текущий исполняемый каталог не проходит тестирование - PullRequest
2 голосов
/ 16 января 2012

Мое приложение реализует своего рода архитектуру плагинов, используя LoadLibrary, GetProcAddress и FreeLibrary. Поскольку все мои dll находятся в том же каталоге, что и исполняемый файл, когда я ищу dll, я получаю каталог исполняемого файла и ищу там, используя эту функцию:

string FileSystem::GetPathToProgramDirectory(){
    char progname[MAX_PATH];
    GetModuleFileNameA( NULL, progname, MAX_PATH );
    PathRemoveFileSpecA( progname );
    return string( progname );
}

Это работает на производстве, но когда я пытаюсь запустить его в интеграционном тесте с использованием NUnit, исполняемый каталог оказывается NUnit, и загрузка не выполняется. Имейте в виду, это неуправляемый C ++; в управляемом C ++ я решил это, используя Path::GetDirectoryName(Assembly::GetExecutingAssembly()->Location), который работает в обоих случаях, но неуправляемый случай поставил меня в тупик. Есть ли для этого неуправляемый эквивалент Winapi?

1 Ответ

2 голосов
/ 16 января 2012

Проблема здесь в том, что GetModuleFileName с первым параметром NULL дает вам путь к исполняемому файлу , в котором в данный момент выполняется код, в то время как вы хотите конкретный модуль , который выполняет код. Поэтому, когда вы запускаете свой код под NUnit, вы получаете исполняемый файл тестового набора вместо того, что вы ожидали.

Что вам действительно нужно, так это получить дескриптор выполняемого в данный момент модуля, а затем передать его в GetModuleFileName. В этом сообщении StackOverflow подробно описан ряд способов получить дескриптор текущего исполняемого модуля.

Объедините текущий дескриптор модуля с кодом, который у вас есть в данный момент, и все это должно работать в NUnit.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...