C++ UI自动化示例错误:LNK2001未解析的外部符号\u CLSID\u AccPropServices
我想编辑对话框控件属性,以便屏幕阅读器可以完全访问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 我试过以下几件事: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
- 我已经尝试将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"