2011-05-20 85 views
0

我想在RPC代碼中定義一個新函數。我是新來的,所以我只是複製功能Output並將其重命名爲Output2。但是當我運行EXE時,輸出函數總是被調用,儘管我真的叫了Output2。需要指導..要正確定義RPC相關定義文件中的函數

這是我在網上找到的代碼。它是某種存根文件,我認爲..

這裏是我一起工作的代碼:

void Output( 
    /* [string][in] */ const char *szOutput) 
{ 

    NdrClientCall2(
        (PMIDL_STUB_DESC )&Example1_StubDesc, 
        (PFORMAT_STRING) &Example1__MIDL_ProcFormatString.Format[0], 
        (unsigned char *)&szOutput); 

} 



void Output2(const char *test) // <---- I added this definition 
{ 

    NdrClientCall2(
        (PMIDL_STUB_DESC )&Example1_StubDesc, 
        (PFORMAT_STRING) &Example1__MIDL_ProcFormatString.Format[0], 
        (unsigned char *)&test); 

} 

回答

1

this page圖表可以幫助你瞭解下面的解釋。你所做的是創建了一個名爲「Output2」但是的第二個客戶端存根,新客戶端存根調用與「Output」相同的服務器存根(因爲它將相同的值傳遞給NdrClientCall2的參數1和2)存根結束調用相同的服務器應用程序功能。

假設您的RPC應用程序是合理構建的,您不應該編輯包含NdrClientCall2調用的文件。客戶端存根文件通常由MIDL編譯器生成。您需要找到您的應用程序的IDL文件(可能還有關聯的ACF文件),並將Output2的定義添加到您的IDL中。然後,在重建客戶端項目時,MIDL編譯器應該編譯新修改的IDL文件(如果需要,還需要ACF文件)並生成新的客戶端存根。

同樣,當您編譯您的服務器項目(使用相同的IDL)時,MIDL編譯器將生成新的服務器存根文件。根據您的服務器應用程序的編寫方式,您可能需要編輯服務器存根文件以將存根連接到該函數的實際實現。

某些文章here可能會有用,但如果您不瞭解RPC的工作方式,則可能會咬掉更多的東西,而不是咀嚼。

+0

是的。現在我明白了IDL文件的存在:)感謝兄弟。 – karikari 2011-05-23 00:51:22