bugfix> c++ > 投稿

Pocoライブラリ(イベント)が含まれていないときにシームレスに動作しているWindowsユーザーを認証するC ++プログラムを作成しました。 Sererアプリケーションから要求が来ていないときに停止する必要がある無限whileループ(while(true))があります。ソケット読み取りは、個別のスレッドで独立して実行されます。

コンパイラ:MingW 7.2

C ++標準:C ++ 14

パッケージマネージャー:Msys2

アーキテクチャ:x64

エラーが発生しています:

g++    -c -g -D__DEBUG -I/C/msys64/mingw64/include/boost -I/C/msys64/mingw64/include `pkg-config --cflags libconfig++` `pkg-config --cflags gnutls` -std=c++14  -MMD -MP -MF "build/Debug/MinGW-Windows/Authenticate.o.d" -o build/Debug/MinGW-Windows/Authenticate.o Authenticate.cpp
In file included from C:/msys64/mingw64/include/Poco/Foundation.h:102:0,
                 from C:/msys64/mingw64/include/Poco/Event.h:23,
                 from Common.hpp:41,
                 from Authenticate.hpp:19,
                 from Authenticate.cpp:14:
C:/msys64/mingw64/include/Poco/Platform_WIN32.h:179:92: note: #pragma message: Compiling POCO on Windows without #define POCO_WIN32_UTF8 is deprecated.
  #pragma message("Compiling POCO on Windows without #define POCO_WIN32_UTF8 is deprecated.")
                                                                                            ^
Authenticate.cpp: In member function 'bool Authenticate::authenticateUserCommandLine(std::__cxx11::string, std::__cxx11::string, std::__cxx11::string, std::__cxx11::string&)':
Authenticate.cpp:30:26: error: 'LogonUser' was not declared in this scope
         logonReturnVal = LogonUser(userName.c_str(), domain.c_str(), NULL, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, &token);
                          ^~~~~~~~~
Authenticate.cpp:30:26: note: suggested alternative: 'LogonUserW'
         logonReturnVal = LogonUser(userName.c_str(), domain.c_str(), NULL, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, &token);
                          ^~~~~~~~~
                          LogonUserW
Authenticate.cpp:32:26: error: 'LogonUser' was not declared in this scope
         logonReturnVal = LogonUser(userName.c_str(), domain.c_str(), password.c_str(), LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, &token);
                          ^~~~~~~~~
Authenticate.cpp:32:26: note: suggested alternative: 'LogonUserW'
         logonReturnVal = LogonUser(userName.c_str(), domain.c_str(), password.c_str(), LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, &token);
                          ^~~~~~~~~
                          LogonUserW
Authenticate.cpp: In member function 'bool Authenticate::authenticateUserCommandLine(std::__cxx11::string, std::__cxx11::string, std::__cxx11::string&)':
Authenticate.cpp:54:26: error: 'LogonUser' was not declared in this scope
         logonReturnVal = LogonUser(userName.c_str(), domain.c_str(), NULL, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, &token);
                          ^~~~~~~~~
Authenticate.cpp:54:26: note: suggested alternative: 'LogonUserW'
         logonReturnVal = LogonUser(userName.c_str(), domain.c_str(), NULL, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, &token);
                          ^~~~~~~~~
                          LogonUserW
Authenticate.cpp:56:26: error: 'LogonUser' was not declared in this scope
         logonReturnVal = LogonUser(userName.c_str(), domain.c_str(), password.c_str(), LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, &token);
                          ^~~~~~~~~
Authenticate.cpp:56:26: note: suggested alternative: 'LogonUserW'
         logonReturnVal = LogonUser(userName.c_str(), domain.c_str(), password.c_str(), LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, &token);
                          ^~~~~~~~~
                          LogonUserW

#include <Poco/Event.h> を削除した場合プログラムはエラーなしで正常に動作します。

#define POCO_WIN32_UTF8 を追加した場合 、私は LogonUser を交換する必要があります LogonUserW と 。 #define POCO_WIN32_UTF8 の追加に関する最大の問題私は ::GetLastError() でエラーが発生しているということです関数が見つからないという。

LoginUserの使用法:

if(password.length() == 0)
        logonReturnVal = LogonUser(userName.c_str(), domain.c_str(), NULL, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, &token);
    else
        logonReturnVal = LogonUser(userName.c_str(), domain.c_str(), password.c_str(), LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, &token);

:: GetLastError()使用法:

string Error::GetLastErrorAsString(void)
{
    //Get the error message, if any.
    DWORD errorMessageID = ::GetLastError();
    if(errorMessageID == 0)
        return string(); //No error message has been recorded
    LPSTR messageBuffer = nullptr;
    size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
                                 NULL, errorMessageID, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&messageBuffer, 0, NULL);
    string message(messageBuffer, size);
    //Free the buffer.
    LocalFree(messageBuffer);
    return message;
}