LPSAFEARRAY*
çıkış parametresi üzerinden bir SafeArray döndürmesi gereken bir COM işlevim var. Bu işlev, ATL'nin CComSafeArray
şablon sınıfını kullanarak SafeArray öğesini oluşturur. Benim saf uygulama çıkış parametresine yerel değişkenden sahipliğini taşımak amacıyla CComSafeArray<T>::Detach()
kullanır:Yerel bir CComSafeArray bir LPSAFEARRAY çıkış parametresine nasıl geri döner?
void foo(LPSAFEARRAY* psa)
{
CComSafeArray<VARIANT> ret;
ret.Add(CComVariant(42));
*psa = ret.Detach();
}
int main()
{
CComSafeArray<VARIANT> sa;
foo(sa.GetSafeArrayPtr());
std::cout << sa[0].lVal << std::endl;
}
sorun CComSafeArray::Detach()
bir Unlock
operasyonu gerçekleştirir, böylece zaman SafeArray (ana en sa
bu yeni sahibi case) yok kilit sıfır değildir ve GüvenliArray kilidini açmak için başarısız olur E_UNEXPECTED
(Bu SafeArray ayrılmış olduğundan bir bellek sızıntısına yol açar).
Bir COM yöntemi sınırı aracılığıyla sahipliğini CComSafeArrays arasında aktarmanın doğru yolu nedir?
Düzenleme: Tek bir cevap itibaren şimdiye kadar hata sunucu tarafında (foo
) istemci tarafında (main
) ve üzerinde olduğu görülmektedir, ama zor olduğunu CComSafeArray
degildim inanmak bulmak Bu önemsiz kullanım durumu için tasarlanmamıştır, bir SafeArray'i bir COM yönteminden CComSafeArray
içine almak için şık bir yol olmalıdır.
Hangi Visual Studio sürümünü kullanıyorsunuz? –
Bu, hem VS8 (2005) hem de VS9 (2008) – Motti
için geçerlidir. Deneyimlerime dayanarak, CComSafeArray'i tasarlayan kimsenin aslında hiç kullanmadığını düşünüyorum. İsterseniz kendi sarmalayıcı sınıfınızı kullanabilirsiniz. – Amnon