duxburydutch Ответов: 2

Разрешить файл быстрого доступа


Я использую следующий код для разрешения ярлыка, но CoUninitialize дает нарушение доступа. - Что случилось?

Полное имя тип данных wchar[в max_path];
HRESULT hres = CoInitializeEx(0, COINIT_MULTITHREADED);
HRESULT hr = ResolveIt(fname, FullName, MAX_PATH);
CoUninitialize(); // это все еще дает нарушение доступа

HRESULT ResolveIt(WCHAR *LinkFile, WCHAR Path[], int iPathBufferSize)
{
  Path[0] = '\0'; // Assume failure 

  // Get a pointer to the IShellLink interface. It is assumed that CoInitialize
  // has already been called. 
  IShellLink* psl;
  HRESULT hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl);
  if (SUCCEEDED(hres))
  {
    IPersistFile* ppf;

    // Get a pointer to the IPersistFile interface. 
    hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf);

    if (SUCCEEDED(hres))
    {

      // Load the shortcut. 
      hres = ppf->Load(LinkFile, STGM_READ);
hres = psl->Resolve(GetDesktopWindow(), 0);
      if (SUCCEEDED(hres))
      {

          // Get the path to the link target. 
          hres = psl->GetPath(Path, MAX_PATH, 0, SLGP_SHORTPATH);

      }
      // Release the pointer to the IPersistFile interface. 
      ppf->Release();

    }
    // Release the pointer to the IShellLink interface. 
    psl->Release();
  }
  return hres;
}


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

Я попытался обойтись без вызова интерфейса ->Resolve и изменения параметров, но нарушение доступа остается. В моем примере используется Юникод, поэтому преобразование символов в широкие символы не должно быть необходимым. Возвращаемый путь является правильным, и все возвращаемые значения HRESULT являются S_OK.

Andre Oosthuizen

Может быть, это поможет? - https://stackoverflow.com/questions/2653797/why-does-couninitialize-cause-an-error-on-exit

2 Ответов

Рейтинг:
0

duxburydutch

Извините за слишком быструю публикацию, нарушение доступа исчезает, когда я использую CoInitialize(0) вместо CoInitializeEx(..)


Richard MacCutchan

Это действительно кажется странным. У меня есть аналогичное приложение, и я использую тот же вызов. Однако у меня есть другое приложение, где я использую:

hResult = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);

У меня никогда не было проблем ни с тем, ни с другим.

Рейтинг:
0

KarstenK

Вызов CoInitializeEx() выполняет некоторые действия, такие как загрузка библиотек и чтение из реестра. Поэтому лучше дать ему некоторое время (миллисекунды) для запуска и чем делай свое дело. И лучше это сделать только один раз в приложении, как при запуске.

PS: удалите свое "решение", но измените вопросы.