2014-09-16 5 views
5

Ich habe die D Cookbook Lesen und am Anfang ist da noch der folgende Satz:Könnte eine DLL innerhalb von SAS funktionieren?

D binärkompatibel mit C, aber nicht kompatibel beziehen.

SAS allows users to define and call C functions from within SAS. Aber ich frage mich, wäre es auch möglich, dies von D aus zu tun?

Ich fand Adam Ruppes Antwort, um eine DLL here zu erstellen, und ich versuchte, das zu verwenden, um das DLL-Beispiel aus der SAS-Dokumentation zu erstellen; Allerdings, wenn ich es aufrufen, wird die DLL geladen, und dann fährt SAS zum Absturz (ohne jedes Crash-Protokoll, das ich finden kann).

+0

könnte sein, dass Sie die Funktionen falsch deklariert, ist der Standard nicht geeignet für diese –

+0

Das SAS würde mich nicht überraschen, zum Absturz zu verursachen; Ich habe jedoch sehr begrenzte Erfahrung mit DLLs, und im Wesentlichen keine innerhalb von D. Ich weiß innerhalb von SAS müssen sie die __stdcall Gz Aufruf Konvention verwenden, aber ich bin mir nicht sicher, wie dies innerhalb von D getan wird. – charles

+1

Der Absturz Vermutlich fehlt 'extern (Windows)' wie CyberShadow sagte. Nur um diesen Satz zu verdeutlichen, was ich damit meinte, konnte D Funktionen aufrufen oder ausführen, die von C aus aufgerufen werden können, aber er kann den C-Quellcode nicht direkt lesen. Nun wird ein * Los * C-Code auch als D kompilieren und wird meistens dasselbe tun, aber es gibt einige wichtige Details, die zu überprüfen sind. 'extern' ist einer von ihnen. Passende Typen und Layouts sind ebenfalls wichtig. Mit 'int' ist das einfach, ein C int und ein D int sind gleich. Aber das Passieren von Strings zwischen C und D ist etwas kniffliger. Wenn Sie also versuchen, das zu tun, wird es wahrscheinlich auch abstürzen. –

Antwort

7

Ja, Sie können DLLs in D schreiben, die eine C-API verwenden oder implementieren.

Sie müssen sicherstellen, dass die Funktionssignaturen und Aufrufkonventionen übereinstimmen. Auf der von Ihnen verknüpften Seite wird die Aufrufkonvention als stdcall angezeigt, sodass Ihre D-Funktionen mit extern(Windows) oder extern(System) kommentiert werden müssen.

+0

Dank! Ich fand [diese Seite] (http://dlang.org/attribute.html#linkage) in Bezug auf extern nach der Überprüfung dieser Antwort das Problem behoben. – charles

Verwandte Themen