error LNK2019: unresolved external symbol __imp_RegEnumValueA referenced in function

420
20 декабря 2016, 22:36

Пытаюсь скомпилировать программу на С++, которая хочет прочесть данные о портах в реестре. Знаток С++ я небольшой, я по Java, а это JNI класс, для работы с Java. Уже обгуглися, не понимаю, что он хочет:

cl -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" myJniClass.cpp /link /DLL Microsoft (R) C/C++ Optimizing Compiler Version 19.00.24210 for x64 Copyright (C) Microsoft Corporation. All rights reserved.

Microsoft (R) Incremental Linker Version 14.00.24210.0 Copyright (C) Microsoft Corporation.  All rights reserved.
/out:myJniClass.dll /dll /implib:myJniClass.lib /DLL myJniClass.obj    Creating library myJniClass.lib and object myJniClass.exp myJniClass.obj : error LNK2019: unresolved external symbol
__imp_RegEnumValueA referenced in function Java_serialport_Serial_getSerialPortNames myJniClass.obj : error LNK2019: unresolved external symbol __imp_RegOpenKeyExA referenced in function Java_serialport_Serial_getSerialPortNames myJniClass.dll : fatal error LNK1120: 2 unresolved externals

Для компиляции скачал Visual C++ Build Tools и запустил Visual C++ 2015 x64 Native Build Tools Command Prompt. Сам исходник проверенный, без ошибок. Код успешно компилится через Android Studio + NDK.

Вот проблемный фрагмент кода:

HKEY phkResult;
LPCSTR lpSubKey = "HARDWARE\\DEVICEMAP\\SERIALCOMM\\";
jobjectArray returnArray = NULL;
//if(RegOpenKeyExA(HKEY_LOCAL_MACHINE, lpSubKey, 0, KEY_READ, &phkResult) == ERROR_SUCCESS){
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpSubKey, 0, KEY_READ, &phkResult) == ERROR_SUCCESS){
    boolean hasMoreElements = true;
    DWORD keysCount = 0;
    char valueName[256];
    DWORD valueNameSize;
    DWORD enumResult;
    while(hasMoreElements){
        valueNameSize = 256;
        //enumResult = RegEnumValueA(phkResult, keysCount, valueName, &valueNameSize, NULL, NULL, NULL, NULL);
        enumResult = RegEnumValue(phkResult, keysCount, valueName, &valueNameSize, NULL, NULL, NULL, NULL);
        if(enumResult == ERROR_SUCCESS){
            keysCount++;
        } else if(enumResult == ERROR_NO_MORE_ITEMS){
            hasMoreElements = false;
        } else {
            hasMoreElements = false;
        }
    }

Конкретно участвует функция RegEnumValueA, причём, как видно по ошибке, она превратилась в __imp_RegOpenKeyExA. Эта приставка попадается в сгенерированных .lib и .obj. Например:

e __imp_PurgeComm __imp_SetCommBreak __imp_SetCommMask __imp_SetCommState __imp_SetCommTimeouts __imp_WaitCommEvent __imp_RegEnumValueA __imp_RegOpenKeyExA 
Answer 1

Попробуйте, не спасет ли вас добавление директивы

#pragma comment(lib,"Advapi32")

которая говорит о необходимости включение в проект библиотеки Advapi32, в которой, собственно, и находится ваша функция.

Answer 2

Можно просто добавить в вашей командной строке после .cpp-файла

advapi32.lib

или то же - после /link.

READ ALSO
Как сделать сдвиг с запоминанием?

Как сделать сдвиг с запоминанием?

Как сделать сдвиг значения? У меня переменная Sifra, и при нажатии на оду из двух клавиш, происходит перезапись значения (то есть нажал раз, у меня...

405
Не полное разложение на множители

Не полное разложение на множители

Написал программу, которая бы разлагала любое целое число на множители

347
Заменить символ '/' на “\\”

Заменить символ '/' на “\\”

Нужно в строке заменить все символы / на \\Делал следующим образом:

314