2013-05-09 13 views
7

AGGIORNAMENTO: Aggiunto cosa RoInitialize assomiglia a roapi.hCome dichiarare e link per RoInitialize, RoUninitialize, RoGetActivationFactory e hstring funzioni in Mingw Gcc

Io sono nel processo di scrittura di un C++ 11 biblioteca pura WinRT . Non uso WRL o C++/CX (ovviamente se voglio puro C++ 11).

Ho ottenuto il mio codice per compilare ed eseguire MSVC, ma voglio vedere se riesco a ottenere il codice per compilare ed eseguire su Mingw Gcc. In particolare sto usando Gcc 4.7.2 ottenuto da nuwen.net.

Che cosa ho bisogno a questo punto è un modo per chiamare le funzioni API di Windows RoInitialize RoUnitialize delle funzioni hstring WindowsCreateString, WindowsDuplicateString, WindowsDeleteString RoGetActivationFactory e.

Ho provato la compilazione di questo programma in G ++, ma ottenuto l'errore

extern "C"{ 
__declspec(dllimport)int __stdcall RoInitialize(int); 
} 
int main(){ 
    RoInitialize(1); 
} 

ho provato a compilare, ma ha ottenuto

c:\Users\jrb\Desktop>g++ gccwinrt.cpp 
C:\Users\jrb\AppData\Local\Temp\ccy7y1V9.o:gccwinrt.cpp:(.text+0x1e): undefined 
reference to `[email protected]' 
collect2.exe: error: ld returned 1 exit status 

Se qualcuno mi può puntare nella giusta direzione su come dichiarare questi funzioni e quali librerie ho bisogno di collegare, lo apprezzerei. Anche se è necessario LoadLibrary/GetProcAddress sarei ancora ok con quello Aggiornamento

: Ecco cosa RoInitialize assomiglia nella roapi.h intestazione

ROAPI 
_Check_return_ 
HRESULT 
WINAPI 
RoInitialize(
    _In_ RO_INIT_TYPE initType 
); 

ROAPI is just a define for __declspec(dllimport) 
_Check_return_ is part of SAL (Secure Annotations Language?) 
HRESULT maps to int32 
WINAPI is a define for __stdcall 
RO_INIT_TYPE is an enumeration so int should cover it 
+0

Perdonami se qualcosa è cambiato, ma include solo l'intestazione e l'uso della funzione non è sufficiente? – chris

+1

Cosa succede se includi Roapi.h? Come appare la dichiarazione in questa intestazione? –

+0

Queste funzioni sono solo per Windows 8. Le intestazioni non sono disponibili in mingw gcc. Inoltre, anche se usassi le intestazioni da Visual C++, dovrei comunque collegarmi alla libreria di importazione corretta che Mingw gcc non ha per queste funzioni –

risposta

10

La libreria di importazione per queste funzioni è runtimeobject.lib (che la documentazione MSDN non riesce a menzionare). Può essere trovato in Windows SDK per Windows 8.

0

Se non si dispone del lib importazione che contiene RoInitialize, dovrai utilizzare LoadLibrary/GetProcAddress per risolvere i tipi.

+2

Risposta molto utile! E in quali DLL ci sono queste funzioni? Ti manca la parte più importante! – Elmue

+1

La DLL di coloro che risiedono è 'api-ms-win-core-winrt-l1-1-0.dll': https://msdn.microsoft.com/en-us/library/windows/desktop/dn933214% 28V = vs.85% 29.aspx? f = 255 & MSPPError = -2.147,217396 millions – c00000fd

1

La libreria a cui è necessario collegarsi è windowsapp.lib (e solo questa libreria, rimuovere tutte le altre).

Windowsapp.lib è una libreria "ombrello" che fornisce le esportazioni per le API UWP. Il collegamento a Windowsapp.lib aggiungerà alle dipendenze dell'app le DLL che sono presenti su tutte le famiglie di dispositivi Windows 10.

https://msdn.microsoft.com/en-gb/windows/uwp/get-started/universal-application-platform-guide#writing-code

per il ritardo di caricamento, è necessario caricare api-ms-win-core-winrt-l1-1-0.dll. Questo è elencato come un insieme di API di Windows 8.1, tuttavia se si controlla la documentazione per RoInitialize si dice che il client minimo supportato è Windows 8. Supponendo che si usi LoadLibrary e GetProcAddress, non dovrebbe essere importante.
https://msdn.microsoft.com/en-us/library/windows/desktop/dn933214(v=vs.85).aspx

La DLL effettiva che il metodo è implementato in è combase.dll, ma utilizzano le nuove DLL API come livello di riferimento indiretto in modo che siano liberi di cambiare o aggiornare questi in futuro.

Per riferimento futuro, i set di API per Windows 10 (UWP) sono elencati in una pagina separata per i set di API per Windows 8 (e 8.1). La DLL stub (per il caricamento ritardato) è la stessa.https://msdn.microsoft.com/library/windows/desktop/mt186421