Хорошо, я пытаюсь написать это под WFSExecute, но если я наберу:
WFSPINGETDATA * pingetdata = lpCmdData;
Я получаю ошибку:
errorC2440: «инициализация»: невозможно преобразовать из «LPVOID» в «WFSPINGETDATA *»
Если я закомментирую эту строку, приложение выполнится.
Также, если я напишу:
((WFSPINDATA*) (temp)) ->lpPinKeys = malloc(sizeof(LPWFSPINKEY)*NumberOfKeys) ;
Я получаю ошибку:
errorC2440: ‘=’ не может конвертировать из ‘void’ в ‘LPWFSPINKEY *’
Любое решение, чтобы решить это?
C ++ более строг в отношении безопасности типов, чем C. В этом случае, void*
должен быть приведен к типу при назначении чему-либо, кроме другого void*
,
WFSPINGETDATA * pingetdata = lpCmdData;
невозможно преобразовать из ‘LPVOID’ в ‘WFSPINGETDATA *’
Это означает lpCmdData
это void*
, так что приведение типа необходимо:
WFSPINGETDATA * pingetdata = (WFSPINGETDATA*) lpCmdData;
Или, используя приведение в стиле C ++ вместо преобразования в стиле C:
WFSPINGETDATA * pingetdata = static_cast<WFSPINGETDATA*>(lpCmdData);
((WFSPINDATA*) (temp)) ->lpPinKeys = malloc(sizeof(LPWFSPINKEY)*NumberOfKeys) ;
не может конвертировать из ‘void’ в ‘LPWFSPINKEY *’
malloc()
возвращает void*
поэтому здесь также необходимо приведение типов:
((WFSPINDATA*) (temp)) ->lpPinKeys = (LPWFSPINKEY*) malloc(sizeof(LPWFSPINKEY)*NumberOfKeys);
Или, используя приведения в стиле C ++:
static_cast<WFSPINDATA*>(temp)->lpPinKeys = static_cast<LPWFSPINKEY*>(malloc(sizeof(LPWFSPINKEY)*NumberOfKeys));
Или, используя выделение в стиле C ++ вместо выделения в стиле C:
static_cast<WFSPINDATA*>(temp)->lpPinKeys = new LPWFSPINKEY[NumberOfKeys];
// must use 'delete[] lpPinKeys' instead of 'free(lpPinKeys)' to deallocate the memory
Других решений пока нет …