'dll_file' может быть '0': это не соответствует спецификации для функции 'GetProcAddress' - PullRequest
2 голосов
/ 15 октября 2019

Итак, я хочу использовать созданную мной DLL, и у меня есть это действительно странное предупреждение, я не видел, чтобы кто-то имел эту. Я проверил, возвращает ли LoadLibray «NULL», и это не так.

typedef DATA_BLOB(*encryption_decryption)(DATA_BLOB, bool*);
HINSTANCE dll_file = LoadLibrary(L"dllForEncryptionNDecryptionn.dll");
if (dll_file != NULL) {
    cout << "Library loaded!" << endl;
}
else {
    failed();
}
encryption_decryption encryption = (encryption_decryption)GetProcAddress(dll_file,"encryption");
if(encryption != NULL)
{
    cout << "Workded!" << endl;
}
else
{
    failed();
}
void failed() {
    cout << GetLastError() << endl;
    cout << "Faild!" << endl;
}

Предупреждение в 8-й строке: «dll_file» может быть «0»: это не соответствуетспецификация для функции 'GetProcAddress'. "

Все работает, при запуске программы не выдается никаких сообщений об ошибках.

1 Ответ

1 голос
/ 15 октября 2019

Если что-то пойдет не так в LoadLibrary, вы наберете failed(), который напечатает код ошибки и вернет.

HINSTANCE dll_file = LoadLibrary(L"dllForEncryptionNDecryptionn.dll");
if (dll_file != NULL) {
    cout << "Library loaded!" << endl;
}
else {
    failed(); // returns even when dll_file is NULL
}

// so, here you don't know if it's NULL or a valid handle which is why you get the warning
encryption_decryption encryption = (encryption_decryption)GetProcAddress(dll_file,"encryption");

Если LoadLibrary не удастся, вы откажетесь , а не , используйте этоdll_file позвонить GetProcAddress.

encryption_decryption encryption = nullptr;
HINSTANCE dll_file = LoadLibrary(L"dllForEncryptionNDecryptionn.dll");

if(dll_file) {
    encryption_decryption encryption = 
        (encryption_decryption)GetProcAddress(dll_file,"encryption");
} else {
    // do NOT call GetProcAddress
}

if(encryption) {
    // function successfully loaded
}
...