Verwenden Sie WinRT von C?

Lesezeit: 3 Minuten

Benutzeravatar von Andrew
Andreas

Als ich mir das //BUILD-Zeug ansah, sah ich, dass WinRT-APIs von C-Code verwendet werden können:

Geben Sie hier die Bildbeschreibung ein

Ich freue mich ziemlich über eine frische C-API, die Win32-Entwicklern zur Verfügung steht.

Wo finde ich Informationen zur C-WinRT-API? Inwiefern ist es besser als die vorhandene Win32-C-API?

  • @Mark Die Erweiterungen sind nicht erforderlich, sie erleichtern Ihnen nur das Leben.

    – Pavel Minaev

    15. September 2011 um 20:00 Uhr

  • @Andrew Sie müssen WinRT für die Benutzeroberfläche in Metro-Apps verwenden, Win32 ist nicht wirklich eine Option. Einige Win32-Aufrufe sind zulässig, die meisten UI-bezogenen jedoch nicht.

    – Pavel Minaev

    15. September 2011 um 20:23 Uhr

  • @Lothar: Eine schnelle Google-Suche führte zum Blog des Visual Studio-Teams, der bestätigt, dass die Unterstützung des C99 nicht besser wird. Suchen Sie im Artikel nach „C99“ und Sie werden feststellen, dass VC11 im Vergleich zu VC10 keine neuen Funktionen unterstützt. blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx

    – Paercebal

    16. September 2011 um 8:30 Uhr


  • Es wäre ziemlich masochistisch, WinRT von C aus zu verwenden.

    – David Heffernan

    17. September 2011 um 7:45 Uhr

  • Die Welt ist voll von C-Compilern. MS hat keinen C-Compiler und hat seit Jahren keinen mehr. Warum sollten sie jetzt anfangen?

    – David Heffernan

    17. September 2011 um 8:19 Uhr

Benutzeravatar von Pavel Minaev
Pavel Minaev

WinRT ist im Grunde COM, daher ist die Verwendung von WinRT-Komponenten von C wie die Verwendung von COM-Komponenten von C. Wie zuvor erhalten Sie .idl-Dateien für alle WinRT-Komponenten und auch .h-Dateien, die aus diesen .idl-Dateien erstellt wurden. Die .h-Dateien enthalten sowohl C++- als auch C-Deklarationen (in #ifdef __cplusplus wie benötigt). Sie können sie einfach #einbeziehen und anfangen zu hacken.

Es ist jedoch nicht gerade ordentlich, z. B. so etwas wie C++/CX:

Windows::UI::Xaml::Controls::TextBlock^ tb = ...;
tb->Text = "Foo";

was diesem Vanilla C++ entspricht:

Windows::UI::Xaml::Controls::ITextBlock* tb = ...;
HSTRING hs;
HRESULT hr = WindowsStringCreate(L"Foo", 3, &hs);
// check hr for errors
hr = tb->set_Text(hs);
// check hr for errors
tb->Release();

würde in C geschrieben werden als:

__x_Windows_CUI_CXaml_CControls_CITextBlock* tb = ...;
HRESULT hr;
HSTRING hs;
hr = WindowsCreateString(L"Foo", 3, &hs);
// check hr for errors
hr = __x_Windows_CUI_CXaml_CControls_CITextBlock_put_Text(tb, hs);
// check hr for errors
IUnknown_Release(tb);

Schauen Sie in „C:\Programme (x86)\Windows Kits\8.0\Include\winrt“ in der Entwicklervorschau nach, um die .idl- und .h-Dateien anzuzeigen.

  • Können Sie hier die Verwendung des Zirkumflexes (^) erklären? Ich dachte, es wäre für Verweise auf verwaltete Objekte, aber sind das nicht COM-Zeiger? Wie würde dieser Code in /real/ C++ aussehen?

    – Schwammmann

    17. September 2011 um 4:06 Uhr

  • T^ sind Verweise auf verwaltete Objekte in C++/CLI. Das obige ist eher C++/CX, das (fast) dieselbe Syntax für WinRT wiederverwendet. In diesem Fall, T^ sind intelligente Zeiger auf WinRT-Objekte – genauer gesagt auf Schnittstellen, die erben IInspectable (die wiederum erbt von IUnknown, sie sind also auch COM-Objekte). Wenn Sie sie kopieren, AddRef und Release werden nach Bedarf aufgerufen und ebenso, wenn sie den Geltungsbereich verlassen. Wenn du dynamic_cast etwas T^ zu einem anderen U^das wird tatsächlich ein tun QueryInterface. Es gibt auch T% Typen, die zu T^ wie U& ist zu U*.

    – Pavel Minaev

    17. September 2011 um 6:43 Uhr


  • Gibt es keine ComPtr-Klasse, die verwendet werden kann und die sie fast identisch mit der ^-Version machen würde?

    – Filip Frącz

    19. September 2011 um 7:19 Uhr

  • @Filip ComPtr<T> ist da, aber es würde dich nur loswerden lassen Release() Anruf. Ich konnte keine finden HSTRING Verpackung. Ich denke, ich werde das Beispiel so lassen, wie es ist, damit die Entsprechung zwischen C- und C++-Versionen offensichtlicher wird.

    – Pavel Minaev

    19. September 2011 um 8:19 Uhr

  • @PavelMinaev Ah! Ich habe mir die Header noch einmal angesehen, und derzeit lautet die Definition aus Ihrem Beispiel: __x_ABI_CWindows_CUI_CXaml_CControls_CITextBlock. Das hat mich verwirrt, als ich dein Beispiel ausprobiert habe. Als ich den Kommentar schrieb, hatte ich jedoch ein minimales, vollständiges, reines C-Programm im Sinn – das sicherlich zur Frage des OP passen würde und reichlich Dankbarkeit von C-Fans verdient.

    – Ivan Vucica

    22. November 2012 um 13:38 Uhr

1409980cookie-checkVerwenden Sie WinRT von C?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy