Как правильно скопировать URL-> bstrVal в глобальную переменную? - PullRequest
0 голосов
/ 03 ноября 2010

У меня есть эта функция внутри моей программы:

void CBar::NavigateComplete2(IDispatch *pDisp, VARIANT *URL)
  {

try {
    UpdateBar(UpdateNavigateComplete);
} catch (...) {
    ASSERT(0);
}
  }

Мне нужно получить значение URL из URL->bstrVal этой функции и скопировать его в глобальную переменную, чтобы моя другая функция могла легко ссылаться на него.

Каков подходящий способ сделать это? так как мой текущий метод разрушает стабильность моей программы .. он все время падает.

Ответы [ 2 ]

2 голосов
/ 03 ноября 2010

Я не уверен, что понимаю вопрос или мотивацию.Если все, что вы хотите сделать, это, как описано в вопросе, скопировать значение URL->bstrVal, то самый простой способ использовать класс-оболочку BSTR для глобального.

namespace { // keep global private to .cpp file
    CComBSTR globalURL;
}

void CBar::NavigateComplete2(IDispatch *pDisp, VARIANT *URL)
{
    if (URL != NULL && URL->vt == VT_BSTR)
        globalURL = URL->bstrVal;

В противном случае вам следуетиспользуйте необработанный BSTR и скопируйте его с помощью SysAllocString (и не забудьте SysFreeString, когда закончите с глобальным.

Если вы этого не сделаетескопируйте строку (и скопируйте только указатель), владелец VARIANT уничтожит ее, и вы получите глобальный с висящим указателем.

1 голос
/ 03 ноября 2010

Используйте SysAllocString (URL-> bstrVal), чтобы создать копию из BSTRVAL.вам придется освободить его, когда вы закончите с ним, используя SysFreeString ().

Хотя я должен согласиться с @ Space_C0wb0y, что использование глобального университета для этого подвержено ошибкам.Если UpdateBar не выполняет что-то асинхронное, вы просто должны передать ему URL-> bstrVal в качестве параметра.И даже если UpdateBar планирует асинхронную работу, он все равно должен инкапсулировать создание копии BSTR и связывать ее с асинхронной работой, чтобы избежать расхождений между фоновым кодом и другим событием NavigateComplete, которые пытаются получить доступ к глобальной переменной.(Или вам нужно заблокировать доступ к нему, что в значительной степени сводит на нет асинхронную идею, если вы не знаете, как действительно хорошо оптимизировать свои блокировки)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...