2014-09-16 7 views
5

Czytałem ten D Cookbook i blisko początku jest następujące zdanie:Czy DLL D może działać w SAS?

D jest binarnie kompatybilny z C, ale nie źródło kompatybilne.

SAS allows users to define and call C functions from within SAS. Ale zastanawiam się, czy byłoby to możliwe również z D?

Znalazłem odpowiedź Adama Ruppe'a, aby utworzyć bibliotekę DLL here, i próbowałem tego użyć, aby utworzyć przykład DLL z dokumentacji SAS; jednak za każdym razem, gdy go wezwam, biblioteka dll zostanie załadowana, a następnie SAS przechodzi do awarii (bez logu awarii, który mogę znaleźć).

+0

może oznaczać, że funkcje są nieprawidłowe, ustawienie domyślne nie jest odpowiednie dla tego –

+0

To, co powoduje awarię SAS, nie zdziwiłoby mnie; jednak mam bardzo ograniczone doświadczenie z bibliotekami DLL i zasadniczo nie ma ich w D. Wiem, że w SAS muszą używać konwencji wywoływania __stdcall Gz, ale nie jestem pewien, jak to zweryfikować. D. – charles

+1

Awaria prawdopodobnie brakuje 'extern (Windows)' jak powiedział CyberShadow. Dla wyjaśnienia tego zdania, miałem na myśli, że D może wywoływać lub wywoływać funkcje wywoływalne z C, ale nie może bezpośrednio odczytać kodu źródłowego C. Teraz * część * kodu C również zostanie skompilowana jako D, a większość zrobi to samo, ale jest kilka ważnych szczegółów do sprawdzenia. 'extern' jest jednym z nich. Odpowiednie typy i układy są również ważne. Z 'int', które jest łatwe, C int i D int są takie same. Ale przekazywanie ciągów między literami C i D jest nieco trudniejsze, więc jeśli spróbujesz to zrobić, prawdopodobnie również się zawiesi. –

Odpowiedz

7

Tak, możesz napisać bibliotekę DLL w języku D, które używa lub implementuje C API.

Musisz się upewnić, że sygnatury funkcji i wywołania są zgodne. Na połączonej stronie konwencja wywołująca jest oznaczona jako stdcall, więc funkcje D muszą być opatrzone przypisami extern(Windows) lub extern(System).

+0

Dzięki! Znalazłem [tę stronę] (http://dlang.org/attribute.html#linkage) dotyczącą nazwy zewnętrznej po zweryfikowaniu tej odpowiedzi, która rozwiązała problem. – charles