2014-09-26 11 views
5

Napisałem bibliotekę, która ma pewne funkcje, które są eksportowane. Przykład:Wywołanie innej funkcji znajdującej się na liście funkcji eksportowanych

[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"); 
} 

gdy zgłoszę Test z zewnętrznej aplikacji (Delphi) to działa OK i pojawia się okno komunikatu.
Po wywołaniu Test2, otrzymuję wyjątek External w Delphi. Wyjątek jest odrzucany od razu, nie pokazuje mi nawet okna komunikatu: Test 2. Gdy zadzwonię pod numer Test2, który z kolei wywołuje TestThree, który nie jest funkcją eksportu, działa poprawnie i otrzymuję oba komunikaty: komunikat Test 2 i Test 3.

Dlaczego nie mogę wywołać innych eksportowanych funkcji wewnątrz mojej biblioteki DLL? Czy jest jakiś sposób, abym mógł to zrobić?

EDIT 1:

W tym momencie mogę osiągnąć to, co muszę, wykonując następujące czynności: Utworzony inny niż wywóz funkcję Test_Local() przeniósł cały kod z Test. Teraz zamiast dzwonić Test() z TestTwo zgłoszę Test_Local(), funkcja Test wzywa również Test_Local();

Wszystko działa ok, dopóki Test_Local() próbuje uruchomić dowolną inną funkcję wywóz.

Tak więc źle jest wywołać funkcję eksportową wewnątrz innej funkcji eksportu i nie ma znaczenia, ile warstw funkcji niesportowych jest między nimi.

+0

Myślę, że sam odpowiedziałeś na to pytanie. Chciałbym tylko polecić owijanie metod eksportowania do oddzielnej klasy i wstawiać tylko jeden wiersz kodu do każdego z nich. Linia ta byłaby wezwaniem do "faktycznego" kodu wykonawczego. W ten sposób zawsze będzie jasne, które metody są "narażone" i że nigdy nie wywołujesz metod eksportowania w ramach zwykłego kodu. – rocky

Odpowiedz

0

Jedną z możliwości, która mi odpowiada, jest to, że nazwa eksportu i nazwa lokalna dla tej metody jest taka sama. Czy próbowałeś zmienić lokalną nazwę metody?

[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"); 
} 

Nie testowałem tego.

Powiązane problemy