C++/CLI'den yönetilmeyen bir API kullanmam gerekiyor. Bu API, boş bir işaretçiyi keyfi kullanıcı verilerine ve birkaç geri aramaya depolar. Daha sonra bu geri aramaları, kullanıcı verilerini void * olarak geçirerek çağırır. Ben çalışıyorumgcroot güvenli kullanım mı?
static void __stdcall Callback(void* userData) {
((MyType*)userData)->Method();
}
class MyType {
public:
MyType() { RegisterWithApi((void*)this, Callback); }
void Method();
};
:
Şimdiye kadar yani kullanıcı veri olarak onun "bu" işaretçi geçirerek ve bu sınıfa geri API çağrısı yapmak o işaretçi kullanarak yerel bir sınıf vardı Bunu yönetilen bir sınıf kullanarak çevir. Ben işte ben şimdi yapıyorum nasıl yazın gcroot güvenle yerli kodunda bir yönetilen referans olarak saklamak için kullanılabileceğini bulundu:
// This is called by the native API
static void __stdcall Callback(void* userData) {
// Cast back to gcroot and call into managed code
(*(gcroot<MyType^>*)userData)->Method();
}
ref class MyType {
gcroot<MyType^>* m_self;
public:
MyType() {
m_self = new gcroot<MyType^>;
RegisterWithApi((void*)m_self, Callback);
}
~MyType() { delete m_self; }
// Method we want called by the native API
void Method();
}
bu C++/CLI derleyici iyi gibi geliyor olsa da, ben değilim mükemmel bir şekilde güvence verdi. Anladığım kadarıyla, gcroot bir şekilde yönetilen referansını GC tarafından taşındığından takip ediyor. Yönetilmeyen kod tarafından bir void * olarak saklanırken bunu başaracak mıdır? Bu kod güvenli mi?
Teşekkürler.
Marshal :: GetFunctionPointerForDelegate() 'i bir iyilik yapın, bir örnek [burada] (http://stackoverflow.com/questions/2972452/c-cli-pass-managed-delegate-to-unmanaged-code/2973278#2973278) –