【问题标题】:the implementation of FileIO::Read()FileIO::Read() 的实现
【发布时间】:2015-01-16 03:13:51
【问题描述】:

当我阅读 fileIO::read() 的源代码时,我遇到了一个问题。 首先,fileIO::Read()源码是:

enter int32_t FileIO::Read(int64_t offset,
                 char* buffer,
                 int32_t bytes_to_read,
                 const CompletionCallback& cc)
  {
    if (has_interface<PPB_FileIO_1_1>()) {
      return get_interface<PPB_FileIO_1_1>()->Read(pp_resource(),
          offset, buffer, bytes_to_read, cc.pp_completion_callback());
   } else if (has_interface<PPB_FileIO_1_0>()) {
      return get_interface<PPB_FileIO_1_0>()->Read(pp_resource(),
    offset, buffer, bytes_to_read, cc.pp_completion_callback());
  }
  return cc.MayForce(PP_ERROR_NOINTERFACE);
}

我们可以看到,通过get_interface(),我们得到了一个Func Pointer。问题是,如何得到这个指针。 然后我找到了get_interface的源代码:

template <typename T> inline T const* get_interface() {
  static T const* funcs = reinterpret_cast<T const*>(
  pp::Module::Get()->GetBrowserInterface(interface_name<T>()));
  return funcs;
}

然后是GetBrowserInterface()的源码,

const void* Module::GetBrowserInterface(const char* interface_name) {
  return get_browser_interface_(interface_name);
}

Module::Module() : pp_module_(0), get_browser_interface_(NULL), core_(NULL){}

我们可以看到,在构建模块时,我们将 get_browser_interface_ 设置为 NULL,而我发现根本没有调用 InternalInit() Func。 所以它混淆了如何获取Read()指针。Read()的实现源代码在哪里?谢谢。

【问题讨论】:

    标签: google-nativeclient


    【解决方案1】:

    pp::Module::InternalInitppp_entrypoints.cc 中被调用。当您在 ppapi_cpp 库中链接时,此文件中的函数将作为 PPAPI Native Client 模块的入口点调用。

    具体来说,PPP_InitializeModule 被模块加载器调用以初始化 Native Client 模块。

    PPB_FileIO_1_1::Read的源码可以在ppapi库here中找到。这会转发到代理 here

    【讨论】:

    • 非常感谢!除此之外,我还有一个问题。我用VS2012编译源码,生成libs,但是libs和VS2012编译结果的符号不匹配,例如函数pp::Instance::Init(uint32_t, const char*, const char* ,)。我在我的项目中使用了这个函数。我使用了我由 VS2012 生成的库。但是编译器说找不到符号 ??pp::Instance::Init2h3j2(当然名字被弄乱了,我可以'不记得确切的名称)。我使用 dumpbin 导出库的符号。我发现符号(在重整之后)是不同的。
    • 这让我很困惑,我使用 VS2012 生成库,我使用 VS2012 编译我的项目,为什么相同的符号在修改后不同?应该是相同的修改机制?是 MAKEFILE 磨损了吗?
    • 我建议查看编译库和可执行文件时使用的命令行参数。也许您将能够找到导致名称不同的差异。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 2015-07-11
    相关资源
    最近更新 更多