【问题标题】:npWindow->window gives 0 value in NPP_SetWindow function, plugin for Safari browser on MacnpWindow->window 在 NPP_SetWindow 函数中给出 0 值,Mac 上 Safari 浏览器的插件
【发布时间】:2015-10-25 17:18:45
【问题描述】:

一个在 windows 上的 firefox 中运行良好的插件现在正在移植到 Mac 上的 safari。我们正在使用 Xcode 进行开发。我们希望在 Safari 浏览器中有一个可以显示视频的窗口。我阅读了有关 NPP_SetWindow 函数中使用的 NSwindow 的代码如下:

NPError NPP_SetWindow(NPP instance, NPWindow* npWindow)
{
// Get a Cocoa window reference of the browser window
NP_CGContext* npContext = (NP_CGContext*)npWindow->window;
WindowRef window = npContext->window;
NSWindow* browserWindow = [[[NSWindow alloc] initWithWindowRef:window] autorelease];

// Get a Cocoa reference of my carbon window
// yourCarbonWindow should be replaced with the window handle of the carbon
// window that should be tied to the Safari window.
NSWindow* myWindow = [[[NSWindow alloc] initWithWindowRef:yourCarbonWindow] autorelease];

// Now create a parent child relationship
[browserWindow addChildWindow:myWindow ordered:NSWindowAbove];
}

但问题是 npWindow->window 没有任何价值。用 printf 检查时,显示 0 值,表示未初始化或为 NULL。

但在 Firefox 中它具有一定的价值。 有人可以告诉如何在 Safari 中获取 NSWindow 或者问题出在哪里?还有这个碳窗是什么概念?

【问题讨论】:

    标签: xcode safari osx-yosemite nswindow npapi


    【解决方案1】:

    Safari 的现代版本不支持 Carbon 事件模型(这是您的代码 sn-p 使用的),仅支持 Cocoa event model,并且根据文档,该事件模型中的窗口引用为空。

    在很长一段时间内,直接使用窗口一直是 NPAPI 插件(至少在 Mac 上)中的一种反模式,而对于 64 位和进程外插件,这已变得不可能; NSWindow 不在您的插件进程中,因此您无法获得指向它的指针。您应该在 API 建立的上下文或图层(取决于您的绘图模型)中进行绘图,而不是尝试显示您自己的子窗口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多