Ошибка выделения кучи в статической библиотеке - PullRequest
0 голосов
/ 15 августа 2011

У меня есть рабочий проект Visual Studio.

Я создал статическую библиотеку с файлами исходного проекта (кроме main.cpp), также я создал проект "tester" (сстатическая библиотека, связанная с ней) только с файлом 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();

Где я не прав?Это типичная начинающая комиссия, которой я не боюсь?

Извините за мой английский, и спасибо за ваше время!

Ответы [ 2 ]

0 голосов
/ 15 августа 2011

Ошибка в том, что вы должны выделять широкие символы при вызове GetRawInputDeviceInfo.Из руководства

RIDI_DEVICENAME 0x20000007 pData указывает на строку, содержащую имя устройства.

Только для этой команды uiCommand значение в pcbSize - это количество символов (не число байтов).

Другими словами, вы должны написать

wchar_t* name = new wchar_t[size];
GetRawInputDeviceInfo(lDevList[i].hDevice, RIDI_DEVICENAME, name, &size);

Просто после прочтения руководства у меня нет никакого реального опыта работы с этим API, но это кажется вероятным объяснением.

0 голосов
/ 15 августа 2011

Добавьте логику, которая проверяет состояния возврата ошибок при каждом вызове Win32. Возможно, один из них выходит из строя, и когда вы исправите это, остальные сработают. Всегда проверять и обрабатывать ошибки при использовании Win32 API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...