在纯 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++ 具有使用不同语法的实际引用调用,但在底层,编译器将大致相同。