{"id":214,"date":"2008-02-22T20:13:18","date_gmt":"2008-02-22T19:13:18","guid":{"rendered":"http:\/\/blog.m-ri.de\/index.php\/2008\/02\/22\/vs-tipps-tricks-benoetigt-man-eigentlich-noch-def-dateien\/"},"modified":"2008-02-29T20:09:12","modified_gmt":"2008-02-29T19:09:12","slug":"vs-tipps-tricks-benoetigt-man-eigentlich-noch-def-dateien","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2008\/02\/22\/vs-tipps-tricks-benoetigt-man-eigentlich-noch-def-dateien\/","title":{"rendered":"VS-Tipps &#038; Tricks: Ben\u00f6tigt man eigentlich noch DEF Dateien?"},"content":{"rendered":"<p>Das was eine DEF Datei tut, ben\u00f6tigt man oft genug noch. Stellen wir die Frage mal etwas anders:<br \/>\nKann man den Inhalt einer DEF Datei auch wo anders unterbringen?<\/p>\n<p>Ja man kann sich eine DEF Datei sparen. Auch der Linker kennt entsprechende Optionen auf der Befehlszeile, die das gleiche tun, was eben eine DEF Datei macht.<\/p>\n<p>Wer schon mal ATL Support zu einem DLL Projekt hinzugef\u00fcgt hat, oder eine ATL DLL mit VS-2005\/2008 angelegt hat, der wird feststellen, dass es gar keine DEF Datei mehr gibt, aber dennoch Funktionen wie DllCanUnloadNow exportiert werden.<\/p>\n<p>Schaut man sich den Code an, der erzeugt wird, dann sieht man einen netten Block von pragmas.<\/p>\n<pre line=\"1\" lang=\"cpp\">#pragma comment(linker, \r\n        \"\/EXPORT:DllCanUnloadNow=_DllCanUnloadNow@0,PRIVATE\") \r\n#pragma comment(linker, \r\n        \"\/EXPORT:DllGetClassObject=_DllGetClassObject@12,PRIVATE\") \r\n#pragma comment(linker, \r\n        \"\/EXPORT:DllRegisterServer=_DllRegisterServer@0,PRIVATE\") \r\n#pragma comment(linker, \r\n        \"\/EXPORT:DllUnregisterServer=_DllUnregisterServer@0,PRIVATE\")<\/pre>\n<p>Die \u00c4hnlichkeit zur DEF Datei ist frappierend, was aber auch wieder nicht wundert.<br \/>\nNett ist auch, dass man sich die declspec(dllexport) Spielereien sparen kann. Alles macht hier einfach der Linker \u2757<\/p>\n<p>Das eigentliche Problem an dieser Syntax ist, dass man auch den intern gemangelten Namen kennen muss. Es enthebt den Programmierer nicht die Funktion auch entsprechend korrekt zu deklarieren.<\/p>\n<pre line=\"1\" lang=\"cpp\">#pragma comment(linker, \r\n        \"\/EXPORT:ExportedFunction=_ExportedFunction@0\") \r\nextern \"C\" BOOL __stdcall ExportedFunction() \r\n...<\/pre>\n<p>Der einzige kleine Trick steckt hinter der Frage: Wie kommt man an den gemangelten Namen der Funktion?<br \/>\nAber auch das ist nicht schwer. Funktion gew\u00fcnscht deklarieren und definieren, z.B.:<\/p>\n<pre line=\"1\" lang=\"cpp\">__declspec(dllexport) BOOL __stdcall ExportedFunction2(const char *) \r\n{ \r\n\u00a0return FALSE; \r\n}<\/pre>\n<p>Dann mit Depends, den exportierten Namen abgreifen (rechte Maustaste Copy Function Name).<br \/>\nDann einfach die Funktion final \u00fcbernehmen.<\/p>\n<pre line=\"1\" lang=\"cpp\">#pragma comment(linker, \r\n        \"\/EXPORT:ExportedFunction2=?ExportedFunction2@@YGHPBD@Z\") \r\nBOOL __stdcall ExportedFunction2(const char *) \r\n{ \r\n\u00a0return FALSE; \r\n}<\/pre>\n<p>Netter Effekt: Auf diesem Weg kann man auch eine Funktion leicht unter zwei Namen exportieren&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Das was eine DEF Datei tut, ben\u00f6tigt man oft genug noch. Stellen wir die Frage mal etwas anders: Kann man den Inhalt einer DEF Datei auch wo anders unterbringen? Ja man kann sich eine DEF Datei sparen. Auch der Linker kennt entsprechende Optionen auf der Befehlszeile, die das gleiche tun, was eben eine DEF Datei &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2008\/02\/22\/vs-tipps-tricks-benoetigt-man-eigentlich-noch-def-dateien\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eVS-Tipps &#038; Tricks: Ben\u00f6tigt man eigentlich noch DEF Dateien?\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[30,3,31],"tags":[370,96,37,61],"class_list":["post-214","post","type-post","status-publish","format-standard","hentry","category-c","category-programmieren","category-vs-tipps-tricks","tag-c","tag-linker","tag-vs-tippstricks","tag-winapi"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/214","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/comments?post=214"}],"version-history":[{"count":0,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/214\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=214"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=214"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=214"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}