15

Web'i ve StackOverflow'u çok aradım ancak şu sorularıma kesin bir yanıt bulamıyorum.Çapraz platform C++ kitaplıklarını Windows Phone 8 platformuna taşıma

Bağlam:

Ben Windows Phone 8 (WP8) platformuyla birlikte kullanılmak üzere limana C++ yardımcı kütüphanelerinin bir grup arıyorum. Tarihsel olarak, bu kütüphaneler statik libs (DLL yerine) olarak inşa edilmiştir.

WP8'e özgü kodu başarıyla yazdım, böylece kitaplıklar WP8 için kullanılabilir olan API'leri kullanarak (WP API QuickStart belgesini bir referans noktası olarak kullanarak) ARM uyumlu ve uyumludur. Kütüphanelerden sadece biri (örneğin, Lib1) WinRT'nin ThreadPool ile klasik Win32 Thread çağrılarını değiştirmek zorunda kalması nedeniyle WinRT uzantılarının (/ ZW bayrağı) tüketimini gerektirir.

Lib1'i kurarken, şu uyarıyı alırım: Uyarı 1 uyarı LNK4264:/ZW ile derlenmiş nesne arşiv dosyası statik kütüphaneye; Windows Çalışma Zamanı türlerini yazarken, Windows Çalışma Zamanı meta verilerini içeren statik bir kitaplıkla bağlantı kurmanız önerilmez. -

bu uyarı ararken, ben belirterek, this article bulundu: "Eğer toplu ref sınıfları, kamu arabirim sınıfları veya kamu değer sınıfları oluşturur statik kütüphane tüketmek ise bağlayıcı bu uyarıyı yükseltir güvenle yok sayabilirsiniz. Statik kütüphane, kütüphanenin kendisi dışında tüketilen Windows Runtime bileşenleri üretmiyorsa uyarı Statik kütüphanedeki genel bileşenler derlenecek, ancak çalışma zamanında aktive edilmeyecek.Kullanılacak diğer bileşenler veya uygulamalar tarafından tüketilmesi amaçlanan herhangi bir Windows Runtime bileşeni dinamik bağlantı kitaplığında (DLL) uygulanır. "

Lib1'de ClassA, WinRT ThreadPool çağrılarını kullanarak işlevleri içerir. ClassA işlevleri ClassB tarafından çağrılır ve sadece normal HANDLE'leri ve DWORD'leri ClassB'ye döndürürler.

Kod örnek:

// ClassA.cpp 
HANDLE WINAPI ClassA::CreateThread(/* Params that are usually passed to Win32 CreateThread */) 
{ 
    // Do WinRTThreadPool stuff to create WorkItem 
    auto workItem = ref new Windows::System::Threading::WorkItemHandler([=](Windows::Foundation::IAsyncAction^) 
    // More code that eventually results in a Win32 Handle 

    return handle; 
} 

// ClassB.cpp 
Handle handle = ClassA::CreateThread(/* Params that are usually passed to Win32 CreateThread */); 

Classa fonksiyonları sadece hiç Lib1 içinden, ClassB tarafından çağrılır ve ClassB sonra Lib1 bağlayarak uygulama tarafından kullanılabilir.

Son olarak, benim sorulara:

  1. Can statik kütüphanelerini olarak inşa zaman, , Windows Phone tarafından kullanılacak C++ değil WinRT uzantıları (/ ZW) tüketmek yapmak kütüphaneler 8 uygulamaları ?

  2. o C++ kitaplığı (Lib1) tüketmek gelmez Can WinRT uzantıları statik lib olarak inşa edildiğinde, uyarıya rağmen, Windows Phone 8 uygulamalar tarafından kullanılacak (/ ZW)?

  3. cevap hayır ya soru, ben, ilgili kütüphanesinde sınıfların tamamı için WinRT Bileşen sarmalayıcılarını oluşturmak zorunda kalacak this article gibi Mandelbrot Algoritma ile gösteriyor ise? Yoksa kayıp olduğum başka bir şey var mı?

Sağladığınız herhangi bir girdi için şimdiden teşekkür ederiz.

cevap

5

Soru 1 Evet, sürece telefonda izin verilmez herhangi API'ler, örneğin vb Win32, MFC, standart c özelliklerden bazıları kullanmıyorsanız olarak çevrelerindeki bazı kısıtlamalar var; örneğin, uygulamalarınızın yerel alanında bulunan dosyalarda sadece fopen'i arayabilirsiniz. Elbette, yalnızca statik lib'inizdeki işlevselliğe C++ kodundan erişebilirsiniz. Bu senaryo "Plain Old C++" senaryosunu çağırmaktan hoşlandığım şey. İyi çalışıyor.

Soru 2 Evet, sürece o statik lib tanımlamak herhangi ref sınıfları, yalnızca bu statik lib içinden kullanılmak üzere tasarlanmıştır gibidir. Örneğinizde, A Sınıfı normal bir eski C++ sınıfı olduğu sürece, iyi olacaksınız. Aslında, .NET derlemesindeki genel sınıflar ile aynı anlamda kamuya açık olan ref sınıflarına sahip olamazsınız, çünkü bu bazı COM-on-steroid sihrini gerektirir ve sadece Windows Runtime Components'a derlenir. Herhangi bir ref sınıf koduna çağrılarınızın etrafını saran eski ve eski C++ kodunuz varsa ve statik lib'inizi tüketen kod bunu eski bir C++ yolunda tüketirse, o zaman sorun yoktur. Mantık, bu varsayımı henüz test etmemiş olmama rağmen, WinRT türlerini statik kitaplıktan geçiremeyeceğinizi gösterir.

Soru 3 Sana başvuru makale, etrafına Windows Zamanı Bileşeni sarmalayıcılarını yazmak zorunda değilsiniz statik lib kod ref sınıfları vb erişebilir, böylece merak etmeyin gerçeğini özlüyor inanıyoruz senin statik lib'ler. Bunu yapmak istediğinizde, statik kitaplığınızdaki kodun "Public Classes" (.NET derleme anlamında) aracılığıyla kullanılabilir olmasını istiyorsanız bunu yapmak istersiniz.

Unutulmaması gereken bir şey, hala "windows deposu için" statik bir lib oluşturmaktır. Bu yerel koddur, ancak yine de C++/CX öğelerini yapabilir, yalnızca COM etkinleştirme nesnesini, içinde tanımlanmış türlerin, statik olarak bağlantılı C++ senaryosunun dışında erişilebilir olmasına izin vermez.

İlgili konular