Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Aggiornamento: novembre 2007
A differenza degli altri linguaggi .NET, in Visual C++ sono disponibili funzionalità di interoperabilità che consentono di utilizzare direttamente le API non gestite, incluse le interfacce COM. Queste funzionalità offrono notevoli vantaggi, soprattutto per l'interoperabilità COM.
Esempio
Come nell'esempio in Procedura: utilizzare server COM nativi con TLBIMP, in questo esempio vengono utilizzate le interfacce COM definite nel file Quartz.dll (disponibile nella directory C:\window\System32) per la riproduzione dei file AVI. In questo caso, tuttavia, viene utilizzata l'interoperabilità C++ anziché un assembly di interoperabilità separato generato con Tlbimp.exe. Questa tecnica offre diversi vantaggi. In questo caso, il codice di interoperabilità è incorporato nell'applicazione, quindi non esiste alcuna dipendenza da un assembly separato. Inoltre, l'interfaccia gestita esposta viene personalizzata in modo da rispettare maggiormente le specifiche .NET. Ad esempio, il metodo RenderFile accetta un oggetto System.String anziché un oggetto char*. La versione gestita dell'interfaccia COM è denominata CRCW (Custom Runtime Callable Wrapper).
Sebbene non sia necessario un assembly di interoperabilità, la scrittura delle interfacce CRCW richiede file di intestazione in cui siano definite le interfacce COM. Per i componenti COM che includono librerie dei tipi, questi file di intestazione possono essere generati utilizzando il MIDL Compiler.
Nella prima parte dell'esempio di codice riportato di seguito viene definito il wrapper personalizzato, che espone i membri che verranno esposti all'applicazione gestita. La seconda parte è un'applicazione console che utilizza il wrapper personalizzato per riprodurre i file AVI.
Eseguire il file exe risultante specificando il nome di un file AVI valido. Il rendering del file verrà eseguito in una finestra.
// use_native_COM_servers_with_CRCWs.cpp
// compile with: /clr
// processor: x86
#include <comdef.h>
#import "quartz.tlb" no_namespace
using namespace System;
using namespace System::Runtime::InteropServices;
//_COM_SMARTPTR_TYPEDEF(IMediaControl, IID_IMediaControl);
ref struct Player : public IDisposable {
Player() : fm((new IMediaControlPtr())) {
fm->CreateInstance(__uuidof(FilgraphManager), 0, CLSCTX_INPROC_SERVER);
if ((*fm) == 0)
throw gcnew Exception("Could not create COM object");
}
~Player() {
this->!Player();
}
!Player() {
(*fm).Release();
delete fm;
}
void RenderFile(String^ file) {
IntPtr ip = Marshal::StringToBSTR(file);
BSTR b = static_cast<BSTR>(ip.ToPointer());
(*fm)->RenderFile(b);
Marshal::FreeBSTR(ip);
}
void Run() {
(*fm)->Run();
}
private:
IMediaControlPtr* fm;
};
void DisplayUsage() {
Console::WriteLine("AVIPlayer2: Plays AVI files.");
Console::WriteLine("Usage: AVIPlayer2.EXE <filename>");
}
int main() {
array<String^>^ args = Environment::GetCommandLineArgs();
if (args->Length != 2) {
DisplayUsage();
return 0;
}
String^ filename = args[1];
if (filename->Equals("/?")) {
DisplayUsage();
return 0;
}
Player^ player = gcnew Player;
player->RenderFile(filename);
player->Run();
Console::WriteLine("press any key");
Console::ReadLine();
}