# OpenW

Функция `OpenW` вызывается Far Manager'ом для запуска плагина.

    HANDLE WINAPI OpenW(
      const struct OpenInfo *Info
    );

### Параметры

Info
Указатель на структуру OpenInfo, Far Manager передает служебную информацию об открытом плагине.
В начале функции проверьте, что поле `OpenInfo.StructSize >= sizeof(OpenInfo)`.

### Возвращаемое значение

Eсли функция завершается успешно, то возвращаемое значение - описатель плагина. Этот описатель позже будет передаваться другим функциям плагина для того, чтобы позволить им различать различные копии загруженного плагина. Формат и содержание описателя не важны для Far Manager'а - они могут быть, к примеру, адресом внутреннего объекта плагина, или адресом структуры с данными плагина, или любым другим уникальным идентификатором, отличным от нуля.
В случае неудачного завершения функции, возвращаемое значение должно равняться `NULL`.

Внимание!

- Если значение поля OpenInfo::OpenFrom, принимаемое плагином, равно `OPEN_FROMMACRO`, то возвращаемое значение формируется по правилам:
  - Если плагин вернул `0`, макросу возвращается `false`.
  - Если плагин вернул `1` или `INVALID_HANDLE_VALUE`, макросу возвращается `true`.
  - Чтобы вернуть макросу более одной величины (или одну величину не-булевого типа), плагин должен заполнить структуру FarMacroCall и вернуть в Far Manager указатель на эту структуру.
  - Если плагин хочет открыть панель, он должен поместить её описатель в начальный элемент массива `Values` структуры FarMacroCall и вернуть в Far Manager указатель на эту структуру. Элемент должен быть типа `FMVT_PANEL`. Макросу возвращается значение `true`.

### Замечания

1. Вы можете использовать эту функцию для реализации плагинов, работающих без создания файловых панелей. Просто выполните все необходимые действия и верните `NULL`.
2. В случае, если Far Manager вызывает данную функцию после удачного выполнения AnalyseW, и плагин желает обработать файл без создания панели, верните `PANEL_STOP`.

### Пример

Пример из плагина "ProcList".

    HANDLE WINAPI OpenW(const struct OpenInfo *OInfo)
    {
      Plist* hPlugin = new Plist();

      if (OInfo->OpenFrom == OPEN_COMMANDLINE && (NORM_M_PREFIX(reinterpret_cast< LPCWSTR >(OInfo->Data))))
      {
        if (!hPlugin->Connect((wchar_t*)OInfo->Data))
        {
          delete hPlugin;
          hPlugin = nullptr;
        }
      }

      return hPlugin;
    }