__declspec(dllexport) int expfun1 (int par1, int par2) {} int __attribute__((dllexport)) expfun2 (int par1, int par2) {}
(Bővebben: mindkettő ugyanazt jelenti, és lehet a típus előtt, vagy a függvény neve előtt. Az '_export'-ot nem érti.)
Mindezek nem működnek unix alatt (mármint amikor unix alatt unixra fordítunk), ott csak ez működik: __attribute__ ((visibility ("default"))) ami a default is, szemben a __attribute__ ((visibility ("hidden"))) értékkel.
Továbba van egy olyan, hogy __stdcall -- ezt a Windows-os fordítókon kívül a gcc/mingw is érti, akár simán akár __attribute__(stdcall) szintaxissal. Natív gcc-ben egyik sem megy.
Ebből a következőt vélem levonhatni:
#if defined (__unix__) #define _export __attribute__ ((visibility ("default"))) #define __stdcall
#else --> tf Windows #if defined (__GNUC__) #define _export __declspec(dllexport) #endif #endif
int _export __stdcall expfun3 (int par1, int par2) { return par1*par2; }
A DLL-ek egyik érdekessége, hogy felhasználhatók thread-ek inditásának detektálására. Mondjuk ha a program úgy érzi, hogy nem akarja, hogy külső komponensek (plugin, debgger, malware) thread-eket indítsanak, akkor ezt egy DLL-ben tudja megoldani (DLL_THREAD_ATTACH)
Persze ha a haxor a DLL-t is lecserélheti egy sajátra (vö: search path), akkor ez sem sokat segít.
Csináltam egy DLL-t (compiler: BCC5.5), amiben van DllMain meg DllEntryPoint is, hogy vajon melyiket mikor hívja; statikus és dinamikus linkeléssel is kipróbáltam:
Azt jelenti, hogy az utasításoknak van egy alapértelmezett operandusmérete, értve ezalatt azt, hogy milyen méretű operandusokon dolgoznak (pl. 16-bites vagy 32-bites adatok). Ha egy eredetileg 16-bites utasítás elé odateszed ezt a prefixet, akkor az utasítás operandusmérete megváltozik, mondjuk, ezentúl 32-bites operandusra fog vonatkozni a művelet). Hogy mely utasításoknál mekkorából mekkorát csinál, azt a megfelelő utasítástáblázatokban találhatod meg.
hogy tudom egy dll változóit és függvényeit elérni külső programból? olyan dll-ről van szó, amit nem én írtam, tehát nem tudom változtatni, a külső programnak kéne tudnia használni.
Nem, nem ugyanúgy működik, hanem nagyon hasonlóan. Úgyanúgy azért sem működhet, mert a különféle unixokban sem működik egyformán. Ha van konkrét kérdésed, tedd fel bátran!
Annyira unatkozom, hogy elhatároztam, egypár programot Win alatt is lefordítok (Borland 5.5 Command Line Tools), mégpedig, hogy viccesebb legyen, DLL-t csinálok belőle (illetve LIB-et és DLL-t is kellene, a unix-os *.a és *.so fájloknak megfelelően).
Most az a rettentő érzésem van, hogy csak az fog a DLL-ből exportálódni, ami elé odaírom, hogy __declspec(dllexport)... Esetleg lehetne találni egy módot, hogy ezt ne kelljen, hanem legyen egy 'mindenki export, aki nem statikus' opció?
Nekem jó volt a windows, 10-es directx-et raktam fel (hivatalosat) és nyomta a hibaüzeneteket. átneveztem dwmapi.dll-t volt_dwmapi.dll-re és mindek tökéletesen jó! Ettől ugye nem fog fagyni a gépem?
Nem segít, persze, hogy nem segít. De mégis, mit vársz el tőlünk (eltekintve attól, amit NevemTeve is mond, hogy itt aztán egyáltalán nem jó topikban vagyunk ehhez, hiszen programozáshoz ennek semmi köze)?
Vannak ötleteink eredeti, rendes Windowsra. De amibe valaki belebuherált, arra milyen ötletünk legyen? Honnan tudjuk, mit buherált bele, mit szedett ki, mit tett bele feleslegesen (hiszen a kiindulási pont, hogy aki buherált Windowst csinál, az nem ért hozzá, hozzáértő ember ilyen ostobaságot nem követ el). Olyan, mintha egy autós topikban kérdeznéd, hogy mi a baj a kocsid motorjával, csak éppen senki nem tudja, mi mindent cseréltek ki benne ahhoz képest, amilyen gyári állapotról mindenki tud, tehát amihez viszonyítva lehetne véleménye, tapasztalata.
Egyetlen használható javaslat van ilyenkor, buherált Windows komplett törlése, eredeti Windows telepítése. Onnantól kezdve semmilyen kodekcsomag (az a buhera minősített esete), semmilyen gyanús, ismeretlen, ellenőrizetlen program, és menni fog. És ha egyszer majd valami mégis elromlik, akkor lesz hozzá segítség is, hidd el.
Az segítene, ha értelmesen leírnád, hogy mit csináltál, segített-e a dwmapi.dll átnevezése, mi a pillanatnyi állapot... és persze az se ártana, ha ráébrednél, hogy ennek semmi köze a Programozás fórumhoz...
még annyit hogy nem tudod lehet olyat hogy amiket utólag telepitettem direct x azt letörölni csak ami alapbol fenn volt az maradjon? Lehet elég low kérdés de a direct x a gyengém:D
ez egy buherált windows xp amiben alapbol benne volt a direct x 10 es. A lejátszóim mikor elinditottam egy filmet el se kezdték lefagyott a gép. Ezután (én hülye) ujraraktam a direct x et, mer ez régebben segitett ezen... azután kezdte ezt a hibaüzenetet kiirni.. Nem tudom ezek hogy függhetnek össze. Esetleg vmi tipped van? MEgpróbálom amit mondtálés köszönöma gyors segitséget.