2015-01-16 65 views
0

當我讀取fileIO :: read()的源代碼時,遇到了一個問題。所有的 首先,FILEIO ::閱讀()的源代碼是:執行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.the的問題是,如何讓這個指針。 然後我找到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()的實現的源代碼在哪裏?謝謝。

回答

1

pp::Module::InternalInitppp_entrypoints.cc中被調用。當您鏈接到ppapi_cpp庫時,此文件中的函數將被稱爲PPAPI Native Client模塊的入口點。

具體而言,PPP_InitializeModule由模塊加載器調用以初始化Native Client模塊。

PPB_FileIO_1_1::Read的源代碼可以在ppapi庫here中找到。這轉發給代理here

+0

非常感謝你!除此之外,我還有一個問題。 我使用VS2012編譯source.and生成libs.But庫和VS2012編譯結果的符號不匹配。例如,函數pp :: Instance :: Init(uint32_t,const char *,const char *)我在我的projiect中使用了這個函數,並且我使用了由VS2012生成的庫。但是編譯器說找不到符號?pp :: Instance :: Init2h3j2(當然,這個名字被破壞了,我不記得確切的名字)。並且我使用dumpbin導出libs.的符號。我發現這些符號(損壞之後)是不同的。 – FT9

+0

它使我困惑,我使用VS2012來生成庫,我用VS2012來編譯我的結構,爲什麼同樣的符號在破壞後不同呢?它應該是相同的破壞機制嗎?MAKEFILE蠕蟲? – FT9

+0

我建議看編譯庫和可執行文件時使用的命令行參數。也許你會發現導致名稱被改變的差異。 – binji