C++ UI自动化示例错误:LNK2001未解析的外部符号\u CLSID\u AccPropServices

C++ UI自动化示例错误:LNK2001未解析的外部符号\u CLSID\u AccPropServices,c++,winapi,ui-automation,microsoft-ui-automation,C++,Winapi,Ui Automation,Microsoft Ui Automation,我想编辑对话框控件属性,以便屏幕阅读器可以完全访问UI。我已经尝试了以下代码示例(来自) //在C++文件的顶部。 #包括 #包括“objbase.h” #包括“uiautomation.h” IAccPropServices*_pAccPropServices=NULL; //在创建UI时运行。 void SetControlAccessibleName(HWND hDlg) { HRESULT hr=CoCreateInstance( CLSID_AccPropServices, null

我想编辑对话框控件属性,以便屏幕阅读器可以完全访问UI。我已经尝试了以下代码示例(来自)

<代码> //在C++文件的顶部。 #包括 #包括“objbase.h” #包括“uiautomation.h” IAccPropServices*_pAccPropServices=NULL; //在创建UI时运行。 void SetControlAccessibleName(HWND hDlg) { HRESULT hr=CoCreateInstance( CLSID_AccPropServices, nullptr, CLSCTX_INPROC, IID_PPV_ARGS(&u pAccPropServices)); 如果(成功(hr)) { //加载控件的本地化可访问名称。 WCHAR szName[MAX_LOADSTRING]; 加载字符串( 欣斯特, IDS_COMBOBOX_BIRDS, szName, 数组化(szName)); //现在在控件上设置名称。这将通过UIA公开 //作为元素的Name属性。 hr=\u pAccPropServices->SetHwndPropStr( GetDlgItem(hDlg、IDC组合框), OBJID_客户, 孩子般的自我, 名称\u属性\u GUID, (姓名); } } //当UI被销毁时运行。 无效ClearControlAccessibleName(HWND hDlg) { if(_pAccPropServices!=nullptr) { //清除先前在控件上设置的自定义可访问名称。 MSAAPROPID props[]={Name_Property_GUID}; _pAccPropServices->ClearHwndProps( GetDlgItem(hDlg、IDC组合框), OBJID_客户, 孩子般的自我, 道具, 阵列化(道具); _pAccPropServices->Release(); _pAccPropServices=NULL; } } 尝试生成解决方案时,将显示以下错误:

错误LNK2001未解析的外部符号\u CLSID\u AccPropServices

我试过以下几件事:

  • 我已经尝试将oleacc.lib添加到项目属性>链接器>输入>其他依赖项。 我使用ProcessMonitor检查是否成功找到了oleacc.lib,结果是

  • 添加aleacc.h,如下所示:

#包括
#包括
#包括“objbase.h”
#包括“uiautomation.h”
  • 我尝试将CLSID_AccPropServices更改为同一库中定义的不同GUID。所以我使用IID_IAccPropServices来测试它是否能够构建。的确如此

使用
\uu uuidof(CAccPropServices)
就地
CLSID\u AccPropServices
我不会按原样复制代码,Visual Studio 2019,只要包含initguid,它就可以正常工作。h@SimonMourier-initguid.h此处无法帮助,因为仅存在
EXTERN_C const CLSID CLSID_CAccPropServices等等。没别的了。需要使用uuid.lib(此处定义此符号)或(更好)使用
\uuidof(CAccPropServices)
。这里是visual tudio,在all@RbMm-哈aa。。。您正在使用CLSID_CAccPropServices。。。我这里说的是CLSID_,就像问题中所说的那样。@SimonMourier-是的,真的是我的错。我使用接近DECLSPEC UUID类(“b5f8350b-0548-48b1-a6ee-88bd00b4a5e7”)的CLSID_CACCRPROPSERVICES;但是你需要你的服务。而CLSID_CAccPropServices存在于uuid.lib中,因此不需要注意额外的C符号
// At the top of the C++ file.
#include <initguid.h> 
#include "objbase.h"
#include "uiautomation.h" 
IAccPropServices* _pAccPropServices = NULL;


// Run when the UI is created.
void SetControlAccessibleName(HWND hDlg)
{
    HRESULT hr = CoCreateInstance(
        CLSID_AccPropServices,
        nullptr,
        CLSCTX_INPROC,
        IID_PPV_ARGS(&_pAccPropServices));
    if (SUCCEEDED(hr))
    {
        // Load up the localized accessible name for the control.
        WCHAR szName[MAX_LOADSTRING];
        LoadString(
            hInst,
            IDS_COMBOBOX_BIRDS,
            szName,
            ARRAYSIZE(szName));

        // Now set the name on the control. This gets exposed through UIA 
        // as the element's Name property.
        hr = _pAccPropServices->SetHwndPropStr(
            GetDlgItem(hDlg, IDC_COMBOBOX_BIRDS),
            OBJID_CLIENT,
            CHILDID_SELF,
            Name_Property_GUID,
            szName);
    }
}


// Run when the UI is destroyed.
void ClearControlAccessibleName(HWND hDlg)
{
    if (_pAccPropServices != nullptr)
    {
        // Clear the custom accessible name set earlier on the control.
        MSAAPROPID props[] = { Name_Property_GUID };
            
        _pAccPropServices->ClearHwndProps(
            GetDlgItem(hDlg, IDC_COMBOBOX_BIRDS),
            OBJID_CLIENT,
            CHILDID_SELF,
            props,
            ARRAYSIZE(props));

        _pAccPropServices->Release();
        _pAccPropServices = NULL;
    }
}
#include <initguid.h>
#include <oleacc.h>
#include "objbase.h"
#include "uiautomation.h"