我有一个可用的Visual Studio项目。
我还创建了一个包含原始项目文件(main.cpp除外)的静态库 我创建了一个“测试人员”项目(链接到它的静态库),只有原始项目中的main.cpp文件。
两者都编译没有任何相关错误。 测试人员运行得恰到好处。
但是!在测试“测试人员”时,我收到了堆分配错误(不是第一个) new []运算符在库中实现的构造函数中调用。
该行在原始项目中正常工作,没有任何错误。
代码的“小”版本:
//the staticlib
void test() {
manager* m = new manager;
m->open();
}
//....
class manager {
public:
open() {
PRAWINPUTDEVICELIST lDevList;
UINT lDevCount;
GetRawInputDeviceList(NULL, &lDevCount, sizeof(RAWINPUTDEVICELIST));
lDevList = (PRAWINPUTDEVICELIST) malloc(sizeof(RAWINPUTDEVICELIST)*lDevCount);
GetRawInputDeviceList(lDevList, &lDevCount, sizeof(RAWINPUTDEVICELIST));
if(lDevCount) {
for(UINT i = 0; i < lDevCount; i++) {
HIDP_CAPS mCaps;
PHIDP_BUTTON_CAPS mButtonCaps;
PHIDP_VALUE_CAPS mValueCaps;
UINT size;
GetRawInputDeviceInfo(lDevList[i].hDevice, RIDI_DEVICENAME, NULL, &size);
char* name = new char[size+1];
//just to be sure
memset(name, 0, size+1);
//surely sure
name[size] = '\0';
GetRawInputDeviceInfo(lDevList[i].hDevice, RIDI_DEVICENAME, name, &size);
HANDLE lDev = CreateFile((LPCWSTR)name, 0, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL);;
PHIDP_PREPARSED_DATA lPrep;
HidD_GetPreparsedData(lDev, &lPrep);
HidP_GetCaps(lPrep, &mCaps);
if(mCaps.NumberInputButtonCaps) {
//crash is here below
//mCaps.NumberInputButtonCaps ~1
mButtonCaps = new HIDP_BUTTON_CAPS[mCaps.NumberInputButtonCaps];
HidP_GetButtonCaps(HidP_Input, mButtonCaps, &mCaps.NumberInputButtonCaps, lPrep);
}
if(mCaps.NumberInputValueCaps) {
//if the first "crash-line" is commented, then
//the crash is here
mValueCaps = new HIDP_VALUE_CAPS[mCaps.NumberInputValueCaps];
HidP_GetValueCaps(HidP_Input, mValueCaps, &mCaps.NumberInputValueCaps, lPrep);
}
CloseHandle(lDev);
}
}
}
};
//the app
test();
我哪里错了?这是一个典型的新手委托我不怕吗?
对不起我的英文,感谢你的时间!
答案 0 :(得分:0)
添加逻辑,检查每次Win32调用的错误返回状态。可能其中一个失败了,当你解决这个问题时,其余的都会有效。 始终在使用Win32 API时检查并处理错误。
答案 1 :(得分:0)
错误是您在调用GetRawInputDeviceInfo时应该分配宽字符。从手册
RIDI_DEVICENAME 0x20000007 pData指向包含设备名称的字符串。
仅对于此uiCommand,pcbSize中的值是字符数 (不是字节数)。
换句话说,你应该写
wchar_t* name = new wchar_t[size];
GetRawInputDeviceInfo(lDevList[i].hDevice, RIDI_DEVICENAME, name, &size);
仅仅阅读手册,我没有使用此API的实际经验,但它似乎是一个可能的解释。