2009-03-09 13 views
1

Tüm StackOverFlow kardeşlerimden çok yardım ettikten sonra C# sınıflarımı COM aracılığıyla çağıran ve verileri harici bir uygulamaya geri ileten bir C++ DLL oluşturmayı başardım. Bu kod çalışmaya başladıktan sonra krallıkta çok fazla kutlama yapıldı.C++ sınıfımda COM aracılığıyla çağırdığım C# sınıfını koşullu olarak nasıl seçmeliyim?

Şimdi yeni bir sorunum var. DLL'yi genişletiyorum, böylece farklı sınıfları (hepsi aynı arayüzü uygulayarak) çağırabilir. Yüklendiğinde DLL'ye iletilen bir char dizisine bağlı olarak hangi sınıfın çağrılacağına karar vermem gerekiyor. Kullandığım yöntemler, kullandığım sınıftan bağımsız olarak tamamen aynıdır. DLL'yi çağırırken sınıflar arasında geçiş yapmanın en iyi yolu nedir?

// Initialize COM. 
HRESULT hr = CoInitialize(NULL); 



// I want to do something like this....but how? 
if (strcmp(modelType, "Model1") == 0) { 
     IUnitModelPtr pIUnit(__uuidof(ClassOne)); 
    } 

    if (strcmp(modelType, "Model2") == 0) { 
     IUnitModelPtr pIUnit(__uuidof(ClassTwo)); 
    } 


//call method 1 

//call method 2 

CoUninitialize(); 

//exit 

Bu, muhtemelen oldukça basit bir sorudur, ancak gerçekten C++ bilmiyorum. Sadece COM’u kullanmak benim için büyük bir zorluktu.

düzenleme: Bunu başarmak için bazı süper zarif yollar olduğundan eminim (yansıma?) Ama lütfen önerilerinizi kolayca uygulanabilecek bir şeyle sınırlayın .... verimlilik burada önemli değildir ve bakımın yapılması gerçekten bir sorun değildir. Böyle

cevap

2

Do yetiremediğin:

GUID classId = GUID_NULL; 
if(strcmp(modelType, "Model1") == 0) { 
    classId = __uuidof(class1); 
} else if(strcmp(modelType, "Model2") == 0) { 
    classId = __uuidof(class2); 
} else if(... etc, continue for all possible model types 
} 
IUnitModelPtr unit; 
unit.CreateInstance(classId); 
// interface methods can be called here 
+0

sayesinde bu tam olarak ne gerekli olduğunu. – Alex

1

iki seçenektir.

Her bir farklı arabirim uygulaması bir coclass olduğu için ve C++ kodunuz oluşturmayı gerçekleştirmek için doğru prog-id/classid kullanır. Alternatif olarak maruz kalan sınıf, gerçek uygulama sınıfını döndürme yöntemine sahip bir fabrikadır.

modelType'unuzu uygulama sınıfına eşlemek için mantığa ihtiyacınız vardır. Bunu C++ kodunda veya .NET kodunda yapabilirsiniz. Genel bağlam hakkında daha fazla bilgi olmadan (- COM bileşeninin veya arayanın mantıksal olarak bir parçası olan eşleme -> dizgesidir).

(COM uygulaması kendi özel COM örneği fabrika oluşturabilir ++ saf C olarak, ama bu daha gelişmiş COM ve NET COM birlikte mevcut değil.)

+0

C# içinde bir fabrika oluşturmak en iyi yol olurdu (string-> coclass mapping mantıksal olarak COM bileşeninin bir parçasıdır), ancak zaman sınırlı olduğundan hızlı düzeltme kazanır. Cevabınız için teşekkürler, yine bunu tekrar yapmak zorunda kalırsam, doğru yolu yapacağım! – Alex