2009-03-09 8 views
1

Après beaucoup d'aide de tous mes frères StackOverFlow, j'ai réussi à créer une DLL C++ qui appelle mes classes C# via COM et transmet les données à une application externe. Il y avait beaucoup de célébration dans le royaume après que ce code a commencé à fonctionner.Comment faire pour conditionner la classe C# invoquer via COM dans ma DLL C++?

Maintenant, j'ai un nouveau problème. J'élargis la DLL pour qu'elle puisse appeler différentes classes (toutes implémentant la même interface). J'ai besoin de décider quelle classe appeler en fonction d'un tableau char passé à la DLL quand il est chargé. Les méthodes que j'appelle sont exactement les mêmes quelle que soit la classe que j'utilise. Quelle est la meilleure façon de basculer entre les classes lors de l'appel de la DLL?

// 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 

Ceci est probablement une question assez simple, mais je ne connais vraiment pas de C++. Le simple fait de faire COM était un défi majeur pour moi.

edit: Je suis sûr qu'il existe des moyens super élégants pour y parvenir (réflexion?) Mais s'il vous plaît limiter vos suggestions à des choses qui peuvent être facilement implémentées ... l'efficacité n'est pas importante ici et la maintenabilité n'est pas vraiment un problème.

Répondre

2

Do smth comme ceci:

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

Merci, c'est exactement ce que je avais besoin. – Alex

1

Deux options.

Comme chaque implémentation d'interface différente est une coclasse, et votre code C++ utilise le bon prog-id/classid pour effectuer la création.

Alternativement, la coclasse exposée est une usine avec une méthode pour retourner la classe d'implémentation réelle.

Les deux nécessitent une logique pour mapper votre modelType à la classe d'implémentation. Vous pouvez le faire dans le code C++ ou dans le code .NET. Sans plus d'informations sur le contexte global (la chaîne -> coclass mappe logiquement une partie du composant COM ou de l'appelant).

(Dans un pur C++ COM mise en œuvre, vous pouvez créer votre propre usine d'instance de COM personnalisé, mais c'est plus avancé COM et non disponible pour .NET COM Interop.)

+0

La création d'une fabrique en C# aurait été la meilleure solution (le mappage chaîne-> coclasse fait logiquement partie du composant COM), mais le temps est limité et le correctif rapide l'emporte. Merci pour votre réponse, si jamais je dois le faire à nouveau, je le ferai de la bonne façon! – Alex

Questions connexes