2010-11-20 2 views
3

Ну, я попытался скомпилировать небольшое тестовое приложение, над которым я работаю.конкретная строка кода, выходящая с кодом 255 после смены кода.

Так держать вещи коротким и простым:

Когда я устанавливаю мой генерации кода из «многопоточных DLL» в «многопоточных», чтобы избавиться от некоторых зависимостей, следующая строка кода разбивает мое приложение (где он обычно работает без каких-либо недостатков)

Аварийное происшествие происходит, когда я хочу преобразовать короткий путь в длинный путь. как таковой:

LPCSTR tmp = reinterpret_cast<LPCSTR>(getenv("Temp")); 
GetLongPathNameA(tmp,tempFolder,MAX_PATH); 

Катастрофа специально происходит на первой линии:

LPCSTR tmp = reinterpret_cast<LPCSTR>(getenv("Temp")); 

Так какие-нибудь идеи здесь, почему он вдруг перестает работать при переключении в режим генерации кода? Благодаря!

EDIT:

После некоторого кода переписывания мне удалось выяснить, что конкретно происходит сбой при выполнении

getenv("Temp"); 

очень и очень странно, видя, как он работает в другом режиме

+0

Есть ли предупреждения, когда вы строите проект? – Dialecticus

+0

Нет, нет, он просто выходит с кодом 255 по какой-то странной причине – zeta

+1

Почему нужен 'reinterpret_cast'? Результатом 'getenv' является' char * ', который должен автоматически преобразовываться в' LPCSTR' (т. Е. 'Const char *'). Если вы получаете ошибки без приведения, они, вероятно, заслуживают внимания. –

ответ

0

ПЫТАЮТСЯ перестроить проект. Очистите его, убедитесь, что в выходной папке ничего не осталось, для хорошей меры удалите .ncb, а затем выполните сборку.

+0

nope, не работает ... – zeta

1

Убедитесь, что все проекты (и все файлы этих проектов) постоянно устанавливаются для компиляции и связывания с той же версией библиотек времени выполнения, то есть многопотоковой статики, в вашем случае. Если вы смешаете эти параметры, компиляции и связанная с ними программа будут иметь неопределенное поведение. Также убедитесь, что вы компилируете и связываете правильные версии внешних библиотек (MFC и т. Д.). В некоторых случаях вам запрещено использовать определенные версии среды выполнения, например. если вы взаимодействуете с .Net, вам нужно использовать многозадачную версию dll.

0

Вы указали libcmt.lib и libcpmt.lib как зависимости в настройках компоновщика после переключения из динамической среды выполнения в статическую? Если нет, попробуйте это. И затем сделайте перестройку.

+0

libcmt.lib уже по умолчанию по умолчанию кажется. libpcmt.lib Мне удалось связать вручную, но он по-прежнему падает – zeta

0

Вы не должны использовать reinterpret_cast, потому что это для объектов, которые наследуются или наследуются от других классов. Просто используйте static_cast для базовых типов или указателей для базовых типов.

+0

Вы уверены, что не думаете о 'dynamic_cast'? 'reinterpret_cast' не имеет ничего общего с наследованием. –

+0

@ Ник Мейер: Да, я был. –

1

Вы должны проверить возвращаемое значение GetEnv() перед доступом к ней:

LPCSTR tmp = getenv("Temp"); 
if(tmp != NULL) 
    // do something with tmp 

Я думаю, что ваша программа не может прочитать переменную среды и доступ к получившемуся NULL-указатель приведет к аварийному завершению работы программы ,

Microsoft рекомендует использовать getenv_s() вместо того, чтобы, вот их образец MSDN слегка модифицирован для работы:

char *tmp; 
size_t requiredSize; 

getenv_s(&requiredSize, NULL, 0, "Temp"); 
tmp = (char *) malloc(requiredSize * sizeof(char)); 
if (tmp != NULL) 
{ 
    getenv_s(&requiredSize, tmp, requiredSize, "Temp"); 
    if(tmp != NULL) 
     // do something with tmp 

    free(tmp); 
} 

Я лично рекомендую переключиться на функцию WinAPI GetEnvironmentVariable() вместо этого, это даст вам более подробное сообщение об ошибке (используйте функцию GetLastError(), если функция не удалась), которая может помочь вам добраться до корня вашей проблемы (или исправить ее, используя одну из этих альтернатив).

Смежные вопросы