【问题标题】:Compilation error when using GetComputerObjectNameW win API使用 GetComputerObjectNameW win API 时出现编译错误
【发布时间】:2021-02-19 08:57:31
【问题描述】:

我在 Visual Studio 上收到以下代码的编译错误。请帮助我理解问题。 如果您没有 Visual Studio,您可以尝试通过以下链接编译代码 https://rextester.com/l/cpp_online_compiler_visual

#include <iostream>
#include <atlbase.h>
#include <secext.h>


int main()
{
        EXTENDED_NAME_FORMAT enf = NameFullyQualifiedDN;
        LPWSTR pwszComputerName;
        DWORD dwLen;
        
        dwLen = 0;
        GetComputerObjectNameW(enf, NULL, &dwLen);
    
        pwszComputerName = new WCHAR[dwLen + 1];
        if(NULL == pwszComputerName)
        {
            return 0;
        }
        if(!GetComputerObjectNameW(NameSamCompatible, pwszComputerName, &dwLen))
        {
            delete pwszComputerName;
            return 0;
        }

        sbstrTrustee = pwszComputerName;
        wprintf(L"GetComputerObjectName: %s\n", pwszComputerName);
        delete pwszComputerName;
        return 0
}

错误如下。

C:\Program Files (x86)\Windows Kits\8.1\include\\shared\secext.h(117): error C2146: syntax error: missing ';' before identifier 'GetUserNameExA'
C:\Program Files (x86)\Windows Kits\8.1\include\\shared\secext.h(121): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
C:\Program Files (x86)\Windows Kits\8.1\include\\shared\secext.h(126): error C2086: 'BOOLEAN SEC_ENTRY': redefinition
C:\Program Files (x86)\Windows Kits\8.1\include\\shared\secext.h(117): note: see declaration of 'SEC_ENTRY'
C:\Program Files (x86)\Windows Kits\8.1\include\\shared\secext.h(126): error C2146: syntax error: missing ';' before identifier 'GetUserNameExW'
C:\Program Files (x86)\Windows Kits\8.1\include\\shared\secext.h(130): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
C:\Program Files (x86)\Windows Kits\8.1\include\\shared\secext.h(140): error C2086: 'BOOLEAN SEC_ENTRY': redefinition
C:\Program Files (x86)\Windows Kits\8.1\include\\shared\secext.h(117): note: see declaration of 'SEC_ENTRY'
C:\Program Files (x86)\Windows Kits\8.1\include\\shared\secext.h(140): error C2146: syntax error: missing ';' before identifier 'GetComputerObjectNameA'
C:\Program Files (x86)\Windows Kits\8.1\include\\shared\secext.h(144): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
C:\Program Files (x86)\Windows Kits\8.1\include\\shared\secext.h(147): error C2086: 'BOOLEAN SEC_ENTRY': redefinition
C:\Program Files (x86)\Windows Kits\8.1\include\\shared\secext.h(117): note: see declaration of 'SEC_ENTRY'
C:\Program Files (x86)\Windows Kits\8.1\include\\shared\secext.h(147): error C2146: syntax error: missing ';' before identifier 'GetComputerObjectNameW'
C:\Program Files (x86)\Windows Kits\8.1\include\\shared\secext.h(151): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
C:\Program Files (x86)\Windows Kits\8.1\include\\shared\secext.h(161): error C2086: 'BOOLEAN SEC_ENTRY': redefinition
C:\Program Files (x86)\Windows Kits\8.1\include\\shared\secext.h(117): note: see declaration of 'SEC_ENTRY'
C:\Program Files (x86)\Windows Kits\8.1\include\\shared\secext.h(161): error C2146: syntax error: missing ';' before identifier 'TranslateNameA'
C:\Program Files (x86)\Windows Kits\8.1\include\\shared\secext.h(167): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
C:\Program Files (x86)\Windows Kits\8.1\include\\shared\secext.h(170): error C2086: 'BOOLEAN SEC_ENTRY': redefinition
C:\Program Files (x86)\Windows Kits\8.1\include\\shared\secext.h(117): note: see declaration of 'SEC_ENTRY'
C:\Program Files (x86)\Windows Kits\8.1\include\\shared\secext.h(170): error C2146: syntax error: missing ';' before identifier 'TranslateNameW'
C:\Program Files (x86)\Windows Kits\8.1\include\\shared\secext.h(176): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
source_file.cpp(28): error C2065: 'sbstrTrustee': undeclared identifier
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x64

【问题讨论】:

    标签: c++ windows visual-studio


    【解决方案1】:

    这段代码有几个错误:

    1. 您应该包含security.h 而不是secext.h(请参阅including secExt.h causes errors)。
    2. 您必须定义SECURITY_WIN32SECURITY_KERNELSECURITY_MAC 之一(请参阅SSPI header file - fatal error)。
    3. sbstrTrustee 变量未声明。
    4. return 0 语句后没有;

    假设您的应用程序是用户模式窗口,代码可能如下:

    #define SECURITY_WIN32 
    #include <iostream>
    #include <atlbase.h>
    #include <security.h>
    
    int main()
    {
      EXTENDED_NAME_FORMAT enf = NameFullyQualifiedDN;
      LPWSTR pwszComputerName;
      DWORD dwLen;
    
      dwLen = 0;
      GetComputerObjectNameW(enf, NULL, &dwLen);
    
      pwszComputerName = new WCHAR[dwLen + 1];
      if (NULL == pwszComputerName)
      {
        return 0;
      }
      if (!GetComputerObjectNameW(NameSamCompatible, pwszComputerName, &dwLen))
      {
        delete pwszComputerName;
        return 0;
      }
    
      //sbstrTrustee = pwszComputerName;
      wprintf(L"GetComputerObjectName: %s\n", pwszComputerName);
      delete pwszComputerName;
      return 0;
    }
    

    您还必须链接Secur32.lib

    【讨论】:

    • 嗨内维拉德,感谢您的快速响应,但我没有得到预期的结果。这个程序在 wprintf 之前返回。
    • 您的问题是关于编译错误的。你没有提到你期望的结果。
    • GetComputerObjectNameW 返回什么?在 GetComputerObjectNameW 调用失败后调用 GetLastError 以获取失败的原因。
    猜你喜欢
    • 2020-09-19
    • 2013-06-16
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多