Dynamic Initializer
-
Hallo,
wie kann ich einen dynamic initializer für exportierte Variablen schreiben? Ich habe mir das Assembly-Listing folgenden Codes angeschaut, bin dadurch aber nicht viel schlauer geworden:
static inline DWORD GetPlatformID() { OSVERSIONINFO osVer = {0}; osVer.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&osVer); return osVer.dwPlatformId; } /* static inline DWORD GetPlatformID() */ /* --------------------------------------------------------------------- */ static DWORD WIN_PLATFORM_ID = GetPlatformID(); /* --------------------------------------------------------------------- */
Der MSVC macht daraus:
text$yc SEGMENT ??__EWIN_PLATFORM_ID@@YAXXZ PROC ; `dynamic initializer for 'WIN_PLATFORM_ID'', COMDAT ; 22 : static DWORD WIN_PLATFORM_ID = GetPlatformID(); push ebp mov ebp, esp sub esp, 192 ; 000000c0H push ebx push esi push edi lea edi, DWORD PTR [ebp-192] mov ecx, 48 ; 00000030H mov eax, -858993460 ; ccccccccH rep stosd call ?GetPlatformID@@YAKXZ ; GetPlatformID mov DWORD PTR _WIN_PLATFORM_ID, eax pop edi pop esi pop ebx add esp, 192 ; 000000c0H cmp ebp, esp call __RTC_CheckEsp mov esp, ebp pop ebp ret 0 ??__EWIN_PLATFORM_ID@@YAXXZ ENDP ; `dynamic initializer for 'WIN_PLATFORM_ID'' text$yc ENDS _BSS SEGMENT _WIN_PLATFORM_ID DD 01H DUP (?) _BSS ENDS CRT$XCU SEGMENT _WIN_PLATFORM_ID$initializer$ DD FLAT:??__EWIN_PLATFORM_ID@@YAXXZ CRT$XCU ENDS
Diese Initialiserungsprozedur wird jedoch nirgendwo gecalled. Allerdings weiß ich mit der Syntax im "CRT$XCU" Segment auch nichts anzufangen.
Hat jemand Rat? Danke vorab.
-
Hier gab es mal eine fast ähnliche Diskussion:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-267999-and-start-is-0-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-.html
Vielleicht hilft es ein wenig weiter...
-
abc.w schrieb:
Vielleicht hilft es ein wenig weiter...
Vielen Dank, aber leider nein.
Mein Ziel ist es eine exportierte Variable vorher zu initialisieren. In C++ ist genau so etwas möglich. Leider werde ich halt aus dem oben gezeigten Assembly-Listing nicht schlau ...
-
Gibt es wirklich niemanden, der mir etwas dazu sagen kann bzw. eine Referenz dazu kennt?
-
mhh... du kannst in einer Module-Definition (.DEF) folgendes angeben:
EXPORTS var DATA
im code (DLL/EXE?, masm?):
public var .data var dd 123
musst mal schaun, obs klapt.
-
masm schrieb:
musst mal schaun, obs klapt.
So etwas klappt schon. Ist aber auch statich. Es kann nur über eine Initialisierungsfunktion gehen, die ich jetzt Aufrufe.
Trotzdem danke für die Mühe.