Roland M Smith Ответов: 1

Передача двоичного указателя на функцию в windows C


Я пытаюсь инкапсулировать CryptStringToBinary в свою собственную функцию, но мне не удается вернуть указатель.
В Ткод под указателем lpDecoded равен нулю.

Что я уже пробовал:

DWORD Base64Decode(LPCSTR pszEncoded, LPBYTE lpDecode64) {
	DWORD dwBufLen = 0;

	// determine size of the encoded buffer
	CryptStringToBinary(pszEncoded, 0,
		CRYPT_STRING_BASE64, NULL, &dwBufLen, NULL, NULL);

	// allocate decoded buffer
	lpDecode64 = (LPBYTE)malloc(dwBufLen);
	memset(lpDecode64, 0x00, dwBufLen);

	// decode the Base64 string
	CryptStringToBinary(pszEncoded, 0,
		CRYPT_STRING_BASE64, lpDecode64,
		&dwBufLen, NULL, NULL);

	return dwBufLen;
}

	CHAR *lpString64 = 0;
	LPBYTE lpDecoded = 0;
	DWORD dwDecodeLen = 0;

	// decode the Base64 string
	dwDecodeLen = Base64Decode(lpString64, lpDecoded);

1 Ответов

Рейтинг:
5

Richard MacCutchan

Вам нужно передать адрес указателя в функцию. Параметр lpDecoded является временным внутри функции, поэтому любое изменение в ней исчезнет, когда функция вернется. Измените свой код на следующий, чтобы адрес буфера был помещен в исходный указатель:

DWORD Base64Decode(LPCSTR pszEncoded, LPBYTE* lpDecode64) {
	DWORD dwBufLen = 0;

	// determine size of the encoded buffer
	CryptStringToBinary(pszEncoded, 0,
		CRYPT_STRING_BASE64, NULL, &dwBufLen, NULL, NULL);

	// allocate decoded buffer
	*lpDecode64 = (LPBYTE)malloc(dwBufLen);
	memset(*lpDecode64, 0x00, dwBufLen); // this is redundant as CryptStringToBinary will immediately overwrite it

	// decode the Base64 string
	CryptStringToBinary(pszEncoded, 0,
		CRYPT_STRING_BASE64, *lpDecode64,
		&dwBufLen, NULL, NULL);

	return dwBufLen;
}

	CHAR *lpString64 = 0;
	LPBYTE lpDecoded = 0;
	DWORD dwDecodeLen = 0;

	// decode the Base64 string
	dwDecodeLen = Base64Decode(lpString64, &lpDecoded);


Roland M Smith

Это сработало, спасибо!

Richard MacCutchan

Одна из многочисленных ловушек Си для неосторожных.