2014-09-16 7 views
5

Ho letto il D Cookbook e vicino all'inizio c'è la seguente frase:Una DLL D può funzionare all'interno di SAS?

D è compatibile a livello binario con la C, ma non sorgente compatibile.

SAS allows users to define and call C functions from within SAS. Ma mi chiedo, sarebbe anche possibile farlo da D?

Ho trovato la risposta di Adam Ruppe per creare una DLL here e ho provato a utilizzarla per creare l'esempio DLL dalla documentazione SAS; tuttavia, ogni volta che vado a chiamarlo, viene caricata la DLL, quindi SAS si arresta in modo anomalo (senza alcun registro degli arresti anomali che riesco a trovare).

+0

potrebbe essere che hai dichiarato le funzioni errate, il valore predefinito non è appropriato per questo –

+0

Ciò che ha provocato il crash di SAS non mi sorprende; tuttavia, ho un'esperienza molto limitata con le DLL, e sostanzialmente nessuna all'interno di D. So che all'interno di SAS devono utilizzare la convenzione di chiamata __stdcall Gz, ma non sono sicuro di come verificare che ciò avvenga entro D. – charles

+1

The crash Probabilmente manca 'extern (Windows)' come diceva CyberShadow. Giusto per chiarire quella frase, però, quello che volevo dire che c'era D può chiamare o rendere le funzioni chiamabili da C, ma non può leggere direttamente il codice sorgente di C. Ora, un * lotto * di codice C verrà compilato come D, e per lo più farà la stessa cosa, ma ci sono alcuni dettagli importanti da controllare. 'extern' è uno di questi. Anche i tipi di corrispondenza e i layout sono importanti. Con 'int' che è facile, un C int e un D int sono gli stessi. Ma passare le stringhe tra C e D è un po 'più complicato, quindi se provi a farlo, è probabile che vada in crash. –

risposta

7

Sì, è possibile scrivere DLL in D che utilizzano o implementano un'API C.

È necessario accertarsi che le funzioni firme e convenzioni di chiamata corrispondano. Nella pagina collegata, la convenzione di chiamata viene indicata come stdcall, pertanto le funzioni D devono essere annotate con extern(Windows) o extern(System).

+0

Grazie! Ho trovato [questa pagina] (http://dlang.org/attribute.html#linkage) per quanto riguarda extern dopo aver verificato questa risposta risolto il problema. – charles

Problemi correlati