2008/06/23

return false palauttaa true

Ongelma esiintyy palautettaessa unmanaged-koodista bool-tyyppinen paluuarvo.
bool succeeded()
{
return false;
}

Kun sitä kutsutaan managed koodista, niin sinne palautuu arvo true.

[DllImport("mylibrary.dll")]
static extern bool succeeded();

...

void MyMethod() {
bool success = succeeded();
// success is now true
}

ANSI C standardi määrittää bool:n yhden tavun arvoksi, 1=true, 0=false. Tässä tapauksessa sitä käsitellää nelitavuisena BOOL-tyyppisenä arvona. Ratkaisuna on nollata eax-rekisteri ennen return-lausetta (tai laittaa sinne mikä tahansa alle 256 luku):
__asm { xor eax, eax };

Toinen (oikea) vaihtoehto on määritellä paluuarvo "oikein".

[DllImport("mylibrary.dll")]
[return:MarshalAs(UnmanagedType.I1)] // A 1-byte signed integer.
static extern bool succeeded();

Applen ohjelmistopäivitin on kätevä, koska se osaa päivittää ohjelmat helpon käyttöliittymän avulla.

Perseestä siinä on se, että se lisää asetuksiin kaikenlaista paskaa käynnistymään tietokoneen mukana. Prosessilistasta löytyy ainakin seuraavat:

* AppleMobileDeviceService.exe
* iPodService.exe
* iTunesHelper.exe

Ne pitää siis vaikka msconfigilla käydä pistämässä pois joka kerta kun Apple päivittää ohjelmistonsa.