[C++/CLI] Functie pointer werkt niet met /clr?*

Pagina: 1
Acties:

  • user109731
  • Registratie: Maart 2004
  • Niet online
Ik ben net bezig met een klein C++ programma, maar loop nu tegen een probleem aan. Ik probeer een functie pointer naar de Sleep functie te laten wijzen:
C++:
1
VOID (WINAPI *SleepPointer)(DWORD dwMilliseconds) = &Sleep;

Dan geef ik hiermee wat test-output:
C++:
1
2
std::cout << "Sleep-location: " << &Sleep << std::endl;
std::cout << "Sleep pointer:  "<< SleepPointer << std::endl;

De output:
Sleep-location: 7C802442
Sleep pointer:  7C802442

Dit lijkt dus goed te gaan, en doet precies wat ik wil. De pointer werkt ook goed verder.

Het gaat om een project met een makefile. Nu zet ik in dat bestand de /clr switch erbij, en ik voeg #pragma unmanaged helemaal bovenaan toe om aan te geven dat alle code umanaged is. Verder veranderd er niets, maar nu is mijn output:
Sleep-location: 10003262
Sleep pointer:  00000000

Hieruit leid ik af dat de pointer niet word toegekend. Weet er misschien iemand hoe dit komt? Ik ben hier al een tijd mee bezig, maar kom er niet uit. Op Google kan ik verder ook niets vinden over gewijzigd gedrag m.b.t. functie-pointers ofzo... Compiler is Visual Studio 2005, mocht het relevant zijn :)

Alle hulp is welkom :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

De taal heet C++/CLI ;)
Maar weird. Je krijgt dus ook geen compile errors of warnings?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • user109731
  • Registratie: Maart 2004
  • Niet online
Klopt, misschien kan een mod een titelchange doen...
Maar weird. Je krijgt dus ook geen compile errors of warnings?
Helemaal niets... Het compiled gewoon goed. Met #pragma unmanaged zou er toch geen verschil mogen zijn tussen met of zonder clr? :) Het gaat trouwens om een DLL.

[ Voor 21% gewijzigd door user109731 op 14-12-2006 13:55 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Bij mij werkt het gewoon
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <windows.h>

#pragma unmanaged
void test()
{
    VOID (WINAPI *SleepPointer)(DWORD dwMilliseconds) = &Sleep;
    std::cout << Sleep << std::endl;
    std::cout << SleepPointer << std::endl;
}
#pragma managed

int main()
{
    test();
}


output:
00401C76
00401C76


Zet eens een breakpoint op die assignment en post de assembly code dan hier?

.edit: wacht. Wanneer doe je de assignment en wanneer output je die pointers? Het is namelijk een DLL, misschien dat de import address table nog niet correct gevuld is (dit zou trouwens wel heel erg foute code op kunnen leveren overigens)

[ Voor 31% gewijzigd door .oisyn op 14-12-2006 14:37 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • user109731
  • Registratie: Maart 2004
  • Niet online
@.oisyn: hartelijk bedankt voor je hulp :) Ik heb zelf net een soortgelijk ander project gemaakt, en daarin werkte het idd ook, ook met /clr. Maar het gaat hier om een bestaand project, die ik handmatig compile met nmake. Ik weet niet goed hoe ik dat in de IDE kan laten draaien :)?

De assignment doe ik helemaal bovenin, de opbouw van mijn bestand is zeg maar zo:
• Includes, defines, e.d.
• Globale variabelen, hier staat ook de assignment
• Functies, met daarbij een DLLMain functie waar ik met cout de output teruggeef.

Zou je misschien wat meer kunnen zeggen over de 'foute code' en de address table :)? Komt die foute code mede door mijn code, en zo ja: hoe kan ik dat verbeteren?

edit: _/-\o_ het werkt nu volgens mij wel :), als ik de assignment vlak voor de cout's doe. Toch ben ik wel benieuwd waar dit verschil vandaan komt? En wat lijkt jou nu de beste oplossing? Ik heb de functie-pointer in minstens 2 functies nodig, daarom was ie ook globaal. Moet ik nu checken op een nullpointer in beide functies, en afhankelijk daarvan 'm toekennen?

[ Voor 20% gewijzigd door user109731 op 14-12-2006 15:22 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je zou de assignment ook in DLLMain kunnen doen.

Toch blijf ik het vreemd vinden hoor, blijkbaar gaat hij dus al code uitvoeren voordat alle geimporteerde functies geresolved zijn.
.edit: of, en dat lijkt me waarschijnlijker trouwens, hij doet de assignment al @ compile-time door gewoon het adres van de Sleep() functie in het geheugen van SleepPointer te bakken. De pointer is dan echter nog niet bekend en dus schrijft hij een 0, en dan vergeet hij waarschijnlijk een relocation entry aan te maken in de dll. Dit is dan een compiler bug :)

[ Voor 111% gewijzigd door .oisyn op 14-12-2006 16:06 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • user109731
  • Registratie: Maart 2004
  • Niet online
.oisyn schreef op donderdag 14 december 2006 @ 15:37:
.edit: of, en dat lijkt me waarschijnlijker trouwens, hij doet de assignment al @ compile-time door gewoon het adres van de Sleep() functie in het geheugen van SleepPointer te bakken. De pointer is dan echter nog niet bekend en dus schrijft hij een 0, en dan vergeet hij waarschijnlijk een relocation entry aan te maken in de dll.
Hm, ingewikkeld, maar het is wel interessant :)
Dit is dan een compiler bug :)
Hmm, en dat moet dan net mij treffen :X Naja, gelukkig is er een eenvoudige workaround Dit verklaart dan wel waarom het zonder /clr wel werkt, al die moderne technieken ook ;)

In ieder geval bedankt voor je hulp, ik wist echt niet waar het probleem zat, voordat je over de assignment-locatie begon :)
Pagina: 1