2014-09-26 53 views
5

我寫了一個庫,其中包含一些正在導出的函數。舉個例子:調用可導出函數列表中的另一個函數

[DllExport("Test", CallingConvention = CallingConvention.StdCall)] 
public static void Test() { 
    MessageBox.Show("Test 1"); 
} 

[DllExport("Test2", CallingConvention = CallingConvention.StdCall)] 
public static void TestTwo() { 
    MessageBox.Show("Test 2"); 
    Test(); 
    //TestThree(); 
} 

public static void TestThree() { 
    MessageBox.Show("Test 3"); 
} 

當我打電話Test從外部應用程序(德爾福)它的工作原理確定,我得到的消息框。
當我打電話給Test2時,我在Delphi中得到了External異常。例外情況立即拋出,它甚至不顯示消息框Test 2。 當我打電話Test2又調用TestThree,這是不可導出的功能,它運行正常,我得到兩個,消息框Test 2Test 3

爲什麼我不能在我的DLL中調用其他導出函數?有什麼辦法可以做到嗎?

編輯1:

在這一點上我可以實現我需要通過執行以下操作: 創建的另一個不可導出功能Test_Local(),感動了所有的代碼從Test。現在,而不是調用從TestTwoTest()我打電話Test_Local(),功能Test還呼籲Test_Local();

一切運行正常,直到Test_Local()嘗試運行任何其他導出功能。

因此,在另一個可導出函數內部調用可導出函數並不重要,它們之間有多少層不可導出函數是無關緊要的。

+0

我想你自己回答了這個問題。我只是推薦將可導出的方法封裝到一個單獨的類中,並且只將一行代碼放到每個類中。該行將是對「實際」執行代碼的調用。這樣就可以清楚地知道哪些方法「暴露」,並且永遠不會在常規代碼中調用可導出的方法。 – rocky 2014-11-23 00:27:58

回答

0

發生在我身上的一種可能性是,方法的導出名稱和本地名稱是相同的。你有沒有嘗試改變方法的本地名稱?

[DllExport("Test", CallingConvention = CallingConvention.StdCall)] 
public static void TestOne() { 
    MessageBox.Show("Test 1"); 
} 

[DllExport("Test2", CallingConvention = CallingConvention.StdCall)] 
public static void TestTwo() { 
    MessageBox.Show("Test 2"); 
    TestOne(); 
    //TestThree(); 
} 

public static void TestThree() { 
    MessageBox.Show("Test 3"); 
} 

我還沒有測試過這個。

相關問題