2010-03-04 5 views
15

Stavo sfogliando i file di intestazione di Platform SDK di Windows (che vita, giusto?) E ho notato che molti posti contenevano riferimenti al simbolo del preprocessore _MAC. Ad esempio:Cosa c'è con "#ifdef _MAC" nei file di intestazione di Windows?

// WinUser.h line 1568 
/* 
* Message structure 
*/ 
typedef struct tagMSG { 
    HWND  hwnd; 
    UINT  message; 
    WPARAM  wParam; 
    LPARAM  lParam; 
    DWORD  time; 
    POINT  pt; 
#ifdef _MAC 
    DWORD  lPrivate; 
#endif 
} MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG; 

Significa "Macintosh", come appare? C'è stato un momento in cui Windows o un sottoinsieme di Windows potrebbero essere compilati per Macintosh?

risposta

13

Una volta Microsoft era il più grande sviluppatore di software Macintosh nel mondo. Excel e Word hanno dominato i rispettivi mercati su Macintosh, e in seguito anche Office. Quindi non è così sorprendente che la divisione applicazioni di MS desideri un sottoinsieme dei file di intestazione di Windows che hanno funzionato sul MAC per rendere più facile la manutenzione del loro software multipiattaforma.

Ma non è mai esistita alcuna versione del sistema operativo Windows in esecuzione su Macintosh.

In ogni caso, questo frammento è da objidl.h, sembra indicare che _MAC effettivamente significa Macintosh in file nell'intestazione anche se ...

//FSSpec is Macintosh only, defined in macos\files.h 
#ifdef _MAC 
    typedef struct tagSTATSTG 
    {      
     LPOLESTR pwcsName; 
      FSSpec *pspec; 
     DWORD type; 
     ULARGE_INTEGER cbSize; 
... 
    } STATSTG; 
#else //_MAC 
3

Presumo che sia/sia stato utilizzato per la compilazione del software Microsoft (Office, IE, Windows Media Player) per MacOS. So che IE e WMP per Solaris includevano un sottoinsieme di Windows stesso (ad es. Libwinnt.so, libkernel32.so) come sostituto diretto delle corrispondenti DLL di Windows.

+0

Un po 'come quando guardi iTunes per Windows, vedi un mucchio di file ".plist" e qualcosa chiamato "Foundation.framework" o simile, IIRC. – asveikau

+0

@asveikau: certo.Molti prodotti Apple per Windows portano anche l'aspetto grafico di MacOS (proprio come i prodotti Microsoft per Solaris), quindi credo che lo facciano al contrario e forniscano a MacOS come API un wrapper per Windows. – jarnbjo

+0

@jarnbjo In realtà, per queste librerie ObjC questo precede sostanzialmente Mac OS X. IIRC, NeXT aveva Foundation/AppKit in esecuzione sotto NT negli anni '90. – asveikau

1

Un sacco di codice MS ha riferimenti a MAC come si sviluppano anche per Mac, ad esempio l'ufficio. Probabilmente questo bit del file di intestazione proveniva da quelle squadre.

+4

Office * non OFFICE. (Ti sto guardando, gente che ha inserito JAVA nei loro curriculum ...) –

+0

basta modificare la risposta damit :-) –

8

Come altri hanno notato, le applicazioni di Microsoft sono stati portati a il Mac, e probabilmente hanno trovato più semplice trasformare le API/framework sottostanti in un livello di astrazione portatile, piuttosto che riscrivere le app stesse ... come riportato dal team QuickTime durante il porting nella direzione opposta (da Mac a Windows - - ci sono condizioni # WIN32 simili nelle intestazioni Carbon del Mac). Ad esempio, piuttosto che sfogliare l'intero codice base dell'applicazione Win32 cercando CreateFile() e sostituendo o condizionando ogni riferimento con #ifdefs, basta creare una versione Mac di CreateFile() e utilizzarlo. Ripetere l'operazione per ogni chiamata API Win32.

Il bit sorprendente di trivia storica è questo: il risultato finale dello sforzo di porting di Microsoft era disponibile per terze parti sotto forma di "Microsoft Visual C++ Cross-Development Edition per Macintosh". Così chiunque può prendere la loro app Win32 e portarla su Mac usando questo livello di astrazione.

Citazione dal mio CD fidato MSDN ottobre 1996:

versione "Microsoft Visual C++ 4.0 Cross-Development Edition per Macintosh facilita il trasferimento di programmi per l'ambiente operativo Microsoft Windows per l'Apple 680x0 ambiente Macintosh o Power Macintosh. Progettato per fornire un ambiente di sviluppo del programma completo, Visual C++ per Macintosh supporta C, la libreria di runtime C standard, C++, la maggior parte dell'API Microsoft Win32, inclusi OLE e ODBC e la libreria di classi di Microsoft Foundation. "

Quindi includeva anche MFC. La mia ipotesi è che qualsiasi "_ifdef _MAC" è un artefatto dell'edizione di sviluppo incrociato MSVC++ per Macintosh (R.I.P.).

+0

Bel pezzo di storia, grazie. – zildjohn01

Problemi correlati