0

我试图在一个名为 StillIamge 的接口中调用一个名为 GetDevicesList 的方法调用,但我得到的是空结果。我认为这是一个指针问题,但我不是 C++ 专家,我认为这就是问题所在。方法调用是:

HRESULT GetDeviceList(
  DWORD dwType,
  DWORD dwFlags,
  [out]  DWORD *pdwItemsReturned,
  [out]  LPVOID *ppBuffer
);

我知道它正在工作,因为当我插入和拔出成像设备时,返回的设备的数量会上下波动。我认为结果为空白的事实是由于我没有得到正确的指针 - 有人可以快速查看一下并让我知道是否是这个原因吗?

#include "stdafx.h"

bool debug = true;

int _tmain(int argc, _TCHAR* argv[])
{
    DWORD dwStiTotal = 0;
    PSTI pSti = NULL;
    HRESULT hres = StiCreateInstance(GetModuleHandle(NULL), STI_VERSION, &pSti, NULL);

    STI_DEVICE_INFORMATION deviceInfo[255];
    memset(deviceInfo,0, sizeof(deviceInfo));

    hres = pSti->GetDeviceList(NULL, NULL, &dwStiTotal, (LPVOID*) deviceInfo); 
    printf("number devices %d\n", dwStiTotal);
    for (int i=0; i<dwStiTotal; i++){
        printf("---------------------------------------------------\n");
        printf("type %d\n", deviceInfo[i].DeviceType);
        printf("vendor %s\n", deviceInfo[i].pszVendorDescription);
        printf("device %s\n", deviceInfo[i].pszDeviceDescription);
        printf("portname %s\n", deviceInfo[i].pszPortName);
        printf("PropProvider %s\n", deviceInfo[i].pszPropProvider);
        printf("LocalName %s\n", deviceInfo[i].pszLocalName);
        printf("InternalName %s\n", deviceInfo[i].szDeviceInternalName);
    }
    pSti->Release();

    if (debug){
        char key;
        std::cin >> key;
    }

    return 0;
}

提前非常感谢,很抱歉提出这样一个基本问题!

问候,

尼尔

4

1 回答 1

1

如果检查 的引用GetDeviceList则最后一个参数ppBuffer是指向STI 分配的缓冲区的(指向 a)句柄。您正在尝试向它发送您自己分配的缓冲区,我相信这甚至应该以某种方式崩溃...

无论如何,这是正确的方法

STI_DEVICE_INFORMATION* deviceInfo = NULL;
hres = pSti->GetDeviceList(NULL, NULL, &dwStiTotal, (LPVOID*) &deviceInfo);

我们得到的是一个指向项目数组的指针,由STI本身STI_DEVICE_INFORMATION分配。完成后,您需要使用.LocalFree

于 2012-06-09T17:38:23.913 回答