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.


Anmelden zum Antworten