在纯 C 中将 VARIANT 的值分配给 BSTR *
Assign value from VARIANT to BSTR * in plain C
我正在使用以下代码在浏览器中获取当前 URL。
...
BSTR url = NULL;
getUrl(&url);
...
void getUrl(BSTR *url){
...
VARIANT urlValue;
VariantInit(&urlValue);
...
hr = IUIAutomationElement_GetCurrentPropertyVlue(pUrlBar,UIA_ValueValuePropertyId,&urlValue);
if(SUCCEEDED(hr)){
url= &urlValue.bstrVal;
}
}
我从变量 url
中得到空值。我想知道我是否正确分配了 VARIANT urlValue
中的值。如何正确获取值?
您正在向您的函数 getUrl() 传递一个 BSTR*。
void getUrl(BSTR*);
您必须取消引用指针才能正确设置原始 BSTR 的值:
if (SUCCEED(hr) && urlValue.vt == VT_BSTR) {
*url = urlValue.bstrVal;
}
考虑一下你可能有一个 int 指针的地方:
// bad implementation
void getInt(int* pint) {
pint = 3; // bad, but basically what you had originally
}
//good
void getInt(int* pint) {
*pint = 3; // correct, dereferencing allows changing the int that pint points to
}
有些人称其为 C 中传递参数的“按引用调用”方法。https://www.tutorialspoint.com/cprogramming/c_function_call_by_reference.htm or https://www.geeksforgeeks.org/difference-between-call-by-value-and-call-by-reference/
不要将它与 C++ 混淆,C++ 具有使用不同语法的实际引用调用,但在底层,编译器将大致相同。
我正在使用以下代码在浏览器中获取当前 URL。
...
BSTR url = NULL;
getUrl(&url);
...
void getUrl(BSTR *url){
...
VARIANT urlValue;
VariantInit(&urlValue);
...
hr = IUIAutomationElement_GetCurrentPropertyVlue(pUrlBar,UIA_ValueValuePropertyId,&urlValue);
if(SUCCEEDED(hr)){
url= &urlValue.bstrVal;
}
}
我从变量 url
中得到空值。我想知道我是否正确分配了 VARIANT urlValue
中的值。如何正确获取值?
您正在向您的函数 getUrl() 传递一个 BSTR*。
void getUrl(BSTR*);
您必须取消引用指针才能正确设置原始 BSTR 的值:
if (SUCCEED(hr) && urlValue.vt == VT_BSTR) {
*url = urlValue.bstrVal;
}
考虑一下你可能有一个 int 指针的地方:
// bad implementation
void getInt(int* pint) {
pint = 3; // bad, but basically what you had originally
}
//good
void getInt(int* pint) {
*pint = 3; // correct, dereferencing allows changing the int that pint points to
}
有些人称其为 C 中传递参数的“按引用调用”方法。https://www.tutorialspoint.com/cprogramming/c_function_call_by_reference.htm or https://www.geeksforgeeks.org/difference-between-call-by-value-and-call-by-reference/
不要将它与 C++ 混淆,C++ 具有使用不同语法的实际引用调用,但在底层,编译器将大致相同。