본문 바로가기
C++

safearray 값을 SafeArrayAccessData 이용해서 읽어 오는 방법

by leo21c 2023. 9. 7.

MSDN을 찾아 봤지만 debug 상태에서는 값을 확인했는데 어떻게 해서 값을 읽어 올 수 있는지 예제를 찾아 보다가 발견했다. 아래 링크를 들어가 보면 원본을 확인 할 수 있다.

내가 이것을 찾게 된 이유는 CodeProject의 질문과 같이 IP주소를 읽어 오기 위해서였다.

덕분에 좋은 정보를 얻었고 혹시 사라질까봐 내 블로그에 남겨둔다.

 

https://www.codeproject.com/Questions/884234/How-Do-I-Get-Ip-Address-From-Win-Networkadaptercon

 

 

[Solved] How Do I Get Ip Address From Win32_Networkadapterconfiguration (Ps: How Do I Get Rate Of Flow) - CodeProject

CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900

www.codeproject.com

NETAddress is a safearray not a string because an adapter can have multiple IP addresses.
Scan the safe array to extract each value.
Use SafeArrayAccessData to get the array pointer.
This code build a string concatenating all ip addresses found:

C++
std::wstring ConvertArrayToString(VARIANT varArr, WCHAR* lpSeparator)
{
	std::wstring		strRet;

	if((VT_ARRAY|VT_BSTR) != varArr.vt)
		return L"";

	BSTR*	arr	= NULL;
	LONG	nLbound	= 0;
	LONG	nUBound = 0;

	SafeArrayGetLBound(varArr.parray, 1, &nLbound);
	SafeArrayGetUBound(varArr.parray, 1, &nUBound);
	SafeArrayAccessData(varArr.parray, (void **)&arr);
	for(int i = 0; i < (nUBound - nLbound + 1); i++)
	{
		if(0 != i)
			strRet += lpSeparator;
		strRet += std::wstring(arr[i]);
	}
	SafeArrayUnaccessData(varArr.parray);

	return strRet;
}


In your code replace:

C++
wprintf(L"Name: %-60s   MAC: %-20s IP: %-20s\n", Name.bstrVal, MACAddress.bstrVal, NETAddress.bstrVal); 


With:

C++
wprintf(L"Name: %-60s   MAC: %-20s IP: %-20s\n", Name.bstrVal, MACAddress.bstrVal, ConvertArrayToString(NETAddress, L" - "));