Как передать объект C в плагин NPAPI?

#c #windows #chromium #npapi #chromium-embedded

#c #Windows #chromium #npapi #встроенный в chromium

Вопрос:

Я пишу плагин NPAPI на C в Windows. Когда создается экземпляр моего плагина, я хочу передать ему некоторые личные данные из моего основного приложения (в частности, я хочу передать ему указатель на объект C ). Похоже, для этого нет механизма. Я что-то упустил? Я не могу просто создать свой объект в экземпляре плагина, поскольку он должен существовать вне области действия экземпляра плагина и сохраняется даже при уничтожении экземпляра плагина.

Редактировать:

Я использую встроенный плагин в C через CEF. Это означает, что мой код по сути является браузером и плагином. Очевидно, что стандартные плагины NPAPI ведут себя не так, так что, вероятно, это не то, что поддерживается самим NPAPI.

Комментарии:

1. Что вы имеете в виду под своим «основным приложением». Вы хотите сказать, что хотите передать объект из какого-то совершенно отдельного приложения, которое уже запущено в экземпляр плагина? Если это так, в вашем вопросе нет ничего специфичного для NPAPI, поэтому вам, вероятно, повезло бы задать новый, более общий вопрос о том, как выполнить IPC в Windows (без упоминания NPAPI).

2. На самом деле, из ваших комментариев ниже звучит так, что, возможно, вы используете NPAPI в качестве интерфейса плагина в своем собственном приложении, а не пишете плагин для браузера. NPAPI предназначен как интерфейс плагина для браузера, поэтому, если вы не пишете плагин для браузера, ваша проблема в том, что вы используете неправильный инструмент для работы.

3. Правильно, извините за путаницу. См. Редактирование моего вопроса выше.

Ответ №1:

Вы не можете передать объект C в javascript; что вы можете сделать, это передать NPObject, который также является объектом C и предоставляет доступ к вещам через интерфейс NPRuntime.

Смотрите http://npapi.com/tutorial3 для получения дополнительной информации.

Возможно, вы также захотите взглянуть на фреймворк FireBreath, который значительно упрощает подобные вещи.

Редактировать: кажется, я неправильно понял ваш вопрос. Вы хотите иметь возможность хранить данные, связанные с экземпляром плагина. Что вам нужно, так это NPP, который предоставляется вам при создании вашего плагина; NPP имеет два члена: ndata (данные netscape) и pdata (данные плагина). Вы можете управлять указателем pdata — вы можете настроить его так, чтобы он указывал на любое произвольное значение, которое вы хотите, а затем возвращал его к реальному типу, когда захотите его использовать. Конечно, не забудьте вернуть его обратно и удалить в NPP_Destroy. Обычно я создаю структуру, чтобы хранить в ней несколько фрагментов информации. FireBreath использует это и отправляет все вызовы плагина в экземпляр объекта плагина, чтобы вы могли действовать так, как если бы это был обычный объект.

Соответствующий пример кода из FireBreath: https://github.com/firebreath/FireBreath/blob/master/src/NpapiCore/NpapiPluginModule_NPP.cpp#L145

Обратите особое внимание на NPP_New и NPP_Destroy; также обратите особое внимание на то, как используется член pdata NPP.

Это также обсуждается в http://npapi.com/tutorial2

Комментарии:

1. Я не пытаюсь передать объект C в JavaScript; Я пытаюсь передать указатель на объект C своему плагину, чтобы он был доступен в интерфейсе NPAPI на стороне C (например, я хотел бы получить к нему доступ в NPP_SetWindow и связанных функциях, есливозможно). Мне кажется странным, что нет (очевидного?) способ передачи личных данных в мой плагин NPAPI.

2. Извините, я неправильно понял; Я пересмотрел свой ответ, чтобы, надеюсь, лучше ответить на ваш вопрос. Предложение, если позволите: не голосуйте, пока не дадите людям возможность пересмотреть свой ответ, если они просто неправильно вас поняли. Вы можете раздражать их настолько, что они не будут утруждать себя ответом. Кроме того, если бы вы перешли по ссылке на учебник и огляделись, вы бы нашли ответ на мой вопрос в tutorial2; конечно, это много чтения. Я все же рекомендовал бы посмотреть на FireBreath, а не делать это вручную.

3. В примере, который вы опубликовали (NpapiPluginModule_NPP.cpp ), NpapiDataHolder создается в NPP_New и ассоциируется с pdata. Это я понял, но моя проблема в том, что я хочу связать объект с pdata, который был создан до создания экземпляра плагина. Другими словами, я надеялся, что существует какой-то доступный механизм, который позволил бы мне передать мой собственный указатель данных в NPP_New . Я начинаю думать, что единственный способ для меня сделать это — использовать SetWindowLongPtr, чтобы связать мой указатель данных с дескриптором окна; затем я мог бы получить этот указатель в NPP_SetWindow .

4. (Кстати, я ценю ваши ответы и прошу прощения, если мой первоначальный вопрос был неясен. Это довольно сложно объяснить ясно. 🙂

5. Я не уверен, как у вас может быть объект, зависящий от экземпляра плагина, до вызова NPP_New; браузер вызывает NPP_New , и вы ничего не можете сделать, чтобы изменить способ его вызова. Однако ничто не мешает вам иметь где-то глобальный объект, к которому вы можете получить доступ из своего экземпляра плагина, или иметь глобальную карту для сопоставления некоторого идентификатора (который вы могли бы передать из javascript и т. Д.) С экземпляром объекта; Я думаю, я действительно не понимаю вашего вопроса. Перейдите в npapi.com/chat когда-нибудь и я посмотрю, смогу ли я помочь лучше. Я по Гринвичу -0600 и обычно в дневное время в будние дни, в некоторые выходные

Ответ №2:

Невозможно сделать это через NPAPI, поскольку концепция не имеет смысла в терминах NPAPI. Даже если вы взломаете что-то, что передает необработанный указатель, предполагается, что все выполняется в одном процессе, поэтому, если CEF переключится на многопроцессорный подход, разработанный Chromium, взлом будет прерван.

Вам было бы лучше притвориться, что это разные процессы, и использовать какой-то метод, отличный от NPAPI, для обмена тем, что вам нужно, между основным приложением и плагином.