- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
当转到 Windows 的“设备管理器”并单击(几乎)列表中的任何设备时,“常规”选项卡中的一条信息称为“位置”。这是一个字符串:
该信息可通过 Windows 的 Unified device property model 获得。 API。
我正在寻找的是从给定的 IMFActivate
对象获取该信息。
有办法吗?我找不到如何从该激活对象获取“设备”信息。我拥有的唯一数据是它的“符号链接(symbolic link)”(在我的例子中,这个字符串:\\?\usb#vid_04b4&pid_8888&mi_00#9&4fe28be&0&0000#{e5323777-f976-4f5b-9b55-b94699c46e44}\global
) 但该链接的格式与我在“位置”中看到的字符串完全不同。
因此我的问题是:如何在给定 IMFActivate
对象的情况下获取设备的“Location”字符串?
更新
这是我用来将 IMFActivate
提供的符号链接(symbolic link)“转换”为设备 id 字符串的代码,该字符串可由 setup-api 函数识别,然后提取“位置字符串”:
CString symLink2Location(const CString & _symLink)
{
DEVINST di;
CString devId = _symLink;
devId = devId.Left( devId.Find(L"#{") );
devId.Replace(L"\\\\?\\", L"");
devId.Replace(L"#", L"\\");
const auto rc = CM_Locate_DevNodeW(&di, devId.GetBuffer(), CM_LOCATE_DEVNODE_NORMAL);
if(rc == CR_SUCCESS){
DEVPROPTYPE dpt;
ULONG sz = MAX_PATH;
WCHAR prop[MAX_PATH];
if(CM_Get_DevNode_PropertyW(di, &DEVPKEY_Device_LocationInfo, &dpt, (PBYTE)&prop, &sz, 0) == CR_SUCCESS){
if(dpt == DEVPROP_TYPE_STRING){
return prop;
}
}
}
return L"";
}
更新 2
下面是 devmgmt.msc
中“声音、视频和游戏 Controller ”下的 3 个音频输入设备:
\\?\SWD#MMDEVAPI#{0.0.1.00000000}。{751fe058-cef2-4d28-bbeb- e438981938d7}#{2eef81be-33fa-4800-9670-1cd474972c3f}
)\\?\SWD#MMDEVAPI#{0.0.1.00000000}。{59267d2e-940b-45f5-8655- 45372787bd85}#{2eef81be-33fa-4800-9670-1cd474972c3f}
)\\?\SWD#MMDEVAPI#{0.0.1.00000000}。{26a4f608-cbd8-4206-b958-d175ee36844 }#{2eef81be-33fa-4800-9670-1cd474972c3f}
)所有 3 个都是 USB 设备,调用 MFEnumDeviceSources
时会列出所有 3 个,但它们的“符号链接(symbolic link)”不会解析为硬件设备。
最佳答案
从IMFAttributes::Get[Allocated]String
返回的字符串使用 MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK
或 MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_SYMBOLIC_LINK
这是我们可以用作 CM_Get_Device_Interface_PropertyW
的输入的设备接口(interface)字符串.获取位置信息(如果存在)需要执行 3 个步骤:
CM_Get_Device_Interface_PropertyW
和 DEVPKEY_Device_InstanceId
- 结果我们得到了设备实例设备标识符CM_Locate_DevNodeW
CM_Get_DevNode_PropertyW
和 DEVPKEY_Device_LocationInfo
代码示例:
CONFIGRET PrintLocation(PCWSTR pszDeviceInterface)
{
ULONG cb = 0, rcb = 64;
static volatile UCHAR guz;
PVOID stack = alloca(guz);
DEVPROPTYPE PropertyType;
CONFIGRET err;
union {
PVOID pv;
PWSTR sz;
PBYTE pb;
};
do
{
if (cb < rcb)
{
rcb = cb = RtlPointerToOffset(pv = alloca(rcb - cb), stack);
}
if (!(err = CM_Get_Device_Interface_PropertyW(pszDeviceInterface, &DEVPKEY_Device_InstanceId, &PropertyType, pb, &rcb, 0)))
{
if (PropertyType == DEVPROP_TYPE_STRING)
{
DbgPrint("InstanceId=%S\n", sz);
DEVINST dnDevInst;
if (!(err = CM_Locate_DevNodeW(&dnDevInst, sz, CM_LOCATE_DEVNODE_NORMAL)))
{
do
{
if (cb < rcb)
{
rcb = cb = RtlPointerToOffset(pv = alloca(rcb - cb), stack);
}
if (!(err = CM_Get_DevNode_PropertyW(dnDevInst, &DEVPKEY_Device_LocationInfo, &PropertyType, pb, &rcb, 0)))
{
if (PropertyType == DEVPROP_TYPE_STRING)
{
DbgPrint("Location=%S\n", sz);
}
else
{
err = CR_WRONG_TYPE;
}
}
} while (err == CR_BUFFER_SMALL);
}
}
else
{
err = CR_WRONG_TYPE;
}
break;
}
} while (err == CR_BUFFER_SMALL);
return err;
}
当然如果硬编码缓冲区大小,函数可以更简单
CONFIGRET PrintLocationSimp(PCWSTR pszDeviceInterface)
{
WCHAR buf[1024];
DEVPROPTYPE PropertyType;
ULONG BufferSize = sizeof(buf);
CONFIGRET err;
if (!(err = CM_Get_Device_Interface_PropertyW(pszDeviceInterface, &DEVPKEY_Device_InstanceId, &PropertyType, (PBYTE)buf, &BufferSize, 0)))
{
if (PropertyType == DEVPROP_TYPE_STRING)
{
DbgPrint("InstanceId=%S\n", buf);
DEVINST dnDevInst;
if (!(err = CM_Locate_DevNodeW(&dnDevInst, buf, CM_LOCATE_DEVNODE_NORMAL)))
{
BufferSize = sizeof(buf);
if (!(err = CM_Get_DevNode_PropertyW(dnDevInst, &DEVPKEY_Device_LocationInfo, &PropertyType, (PBYTE)buf, &BufferSize, 0)))
{
if (PropertyType == DEVPROP_TYPE_STRING)
{
DbgPrint("Location=%S\n", buf);
}
else
{
err = CR_WRONG_TYPE;
}
}
}
}
else
{
err = CR_WRONG_TYPE;
}
}
return err;
}
对于IMFActivate
,我们可以使用下一个代码:
void mftest()
{
IMFAttributes *pAttributes;
if (SUCCEEDED(MFCreateAttributes(&pAttributes, 1)))
{
UINT32 count, cchLength;
IMFActivate **ppDevices, *pDevice;
if (SUCCEEDED(pAttributes->SetGUID(
MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID)) &&
SUCCEEDED(MFEnumDeviceSources(pAttributes, &ppDevices, &count)) &&
count)
{
PVOID pv = ppDevices;
do
{
pDevice = *ppDevices++;
PWSTR pszDeviceInterface;
if (SUCCEEDED(pDevice->GetAllocatedString(
MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK, &pszDeviceInterface, &cchLength)))
{
DbgPrint("%S\n", pszDeviceInterface);
PrintLocation(pszDeviceInterface);
CoTaskMemFree(pszDeviceInterface);
}
} while (--count);
CoTaskMemFree(pv);
}
pAttributes->Release();
}
}
关于Windows 设备 : get "location" string for a given IMFActivate* of a UVC webcam,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45112538/
我想使用结构 DataResponse 作为 JSON() 的参数来响应用户。通过初始化 DataResponse 的实例,我得到了错误消息,给出了太多的参数,但给出了所有必要的参数。 type Da
我正在尝试将 google-one-tap 与本地主机上的 django 项目集成。所以我在 Client ID for Web 的 Authorized JavaScript origins 中添加
考虑一个类A,我如何编写一个具有与相同行为的模板 A& pretty(A& x) { /* make x pretty */ return x; } A pretty(A&& x) {
我正在使用 Hibernate envers 3.6.3.Final。我可以审核表,我可以看到 _audit 表中填充了 revision_number、revision_type 和实体数据。 我正
问题详细描述如下: 给定两个单词(beginWord 和 endWord)和字典的单词列表,找出是否存在从 beginWord 到 endWord 的转换序列,这样: 一次只能更改一个字母 每个转换后
我正在尝试解析任何选定的 mysql 表的单行的所有列字段和数据。 这背后的原因是为任何给定的单行创建一个类似“通用”的表解析器。 例如,我有这个表“tbl1”: +----+------------
我有一个列表,它可能包含也可能不包含重复的元素。给定另一个列表/元素集,我需要该列表中存在的所有唯一元素的列表。 Input: input_list = ['android', 'ios', 'and
需要编写一个算法来查找给定字符串在给定索引处的 Anagram,并按字典顺序排序。例如: Consider a String: ABC then all anagrams are in sorted
给定学生和铅笔的数量,假设学生有 154 名,铅笔有 93 名,如何用 Python 编写代码来获得比率。 输出:x:y 或者说给定两个数字的百分比并找出比率。 输出:x:y 最佳答案 import
给定学生和铅笔的数量,假设学生有 154 名,铅笔有 93 名,如何用 Python 编写代码来获得比率。 输出:x:y 或者说给定两个数字的百分比并找出比率。 输出:x:y 最佳答案 import
作为一名端到端自动化测试人员,我一直认为 Given、When、Then 语句(在使用 Cucumber 时合并到 Gherkin 语言中)应该只按 1.Given、2.When、3 的顺序出现.然后
我正在尝试以动态方式传递参数。我想使用 Perl 函数 given(){},但由于某种原因,我不能在其他任何东西中使用它。这就是我所拥有的。 print(given ($parity) { wh
我想在 cucumber 中测试以下功能。但是,我只想处理输入文件一次(以下功能中的@Given)。但是,它似乎每次都执行@Given 步骤。是否可以在以下功能中仅执行一次此@Given? @file
我想知道是否可以使用 given 参数来自 pytest 的 parametrize 函数。 示例: import pytest from hypothesis import given from h
在deep learning tutorials ,所有训练数据都存储在一个shared数组中,只有该数组的索引被传递给训练函数以切出一个小批量。我知道这允许将数据保留在 GPU 内存中,而不是将小块
我正在尝试运行以下代码: foreach my $k (keys %rec) { #switch for watchlist figures given ($k) { #line 93
我正在尝试在完全支持的情况下使用 GWT 规范,但是它的示例 official documentation有点简单。 在 SO 中搜索我发现了这个问题: Specs2 - How to define
我使用hypothesis 已经有一段时间了。我想知道如何重用 @given parts。 我有一些大约 20 行,我将整个 @given 部分复制到几个测试用例之上。 一个简单的测试例子 @give
我在运行 rspec 文件时不断收到错误: Failures:
让我们调用一个函数 function doSomethingAndInvokeCallback(callback){ // do something callback(); } 我可以
我是一名优秀的程序员,十分优秀!