проблема с API createFile2 в сборке выпуска

#c #winapi #visual-studio-2015 #uwp

#c #winapi #visual-studio-2015 #uwp

Вопрос:

Приведенный ниже код отлично работает с отладочной сборкой, но с выпуском createFile2 возвращает код ошибки 87, т.е. invalid_parameters.

путь одинаков как для отладки, так и для сборки релиза.

 Host_IO::FileRef fileHandle;
#ifdef WIN_UNIVERSAL_ENV
    CREATEFILE2_EXTENDED_PARAMETERS params;
    params.dwFileAttributes = (FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS);
    params.lpSecurityAttributes = 0;
    params.hTemplateFile = 0;
    params.dwFileFlags = 0;
    params.dwSecurityQosFlags = SECURITY_ANONYMOUS;
    fileHandle = CreateFile2((LPCWSTR)wideName.data(), (GENERIC_READ | GENERIC_WRITE), 0, CREATE_ALWAYS, amp;params);
#else
    fileHandle = CreateFileW ( (LPCWSTR)wideName.data(), (GENERIC_READ | GENERIC_WRITE), 0, 0, CREATE_ALWAYS,
                               (FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS), 0 );
#endif

    if ( fileHandle == INVALID_HANDLE_VALUE ) XMP_Throw ( "Host_IO::Create, cannot create file", kXMPErr_InternalFailure );;

    CloseHandle ( fileHandle );
 

Комментарии:

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

2. @DavidHeffernan я предполагаю, что они заменили вызов на XMP_Throw() тот, который печатался GetLastError() . Я просмотрел исходный код XMP SDK, и он не вызывает GetLastError() свою систему исключений.

3. @David, на самом деле я добавил вызов GetLastError во время отладки и обнаружил, что он возвращает 87 в качестве кода ошибки при копировании, вставляя этот код, я каким-то образом удалил его.

4. Просить нас посмотреть код, который не соответствует тому, что у вас есть, контрпродуктивно

Ответ №1:

CREATEFILE2_EXTENDED_PARAMETERS начинается с dwSize поля; вы должны правильно инициализировать sizeof (CREATEFILE2_EXTENDED_PARAMETERS) его, как и любую другую структуру Windows API с dwSize полем. (Вы также должны инициализировать остальную часть структуры нулем, просто на всякий случай.)