2011-04-14 30 views
7

Şu anda MS Windows SDK 6.1'den VSHADOW.EXE 3.0 çalışıyorum. Komut satırını bir dize olarak bekleyen yeni yazılmış bir işlevi dışa aktaran ve sonra eski wmain'u çağıran bir DLL'ye dönüştürülebilen bir sürüm oluşturdum. DLL bir COM sunucusu değil. Bir EXE gibi derlenmiş ancak bu çağrı başarısız çünkü bir DLL olarak derlenmiş oldukça işe değil yaptığındaCOM CoInitializeSecurity neden DLL'imde başarısız oluyor?

Eski bire bir çalışır: HRESULT hata 0x80010119 (RPC_E_TOO_LATE, Güvenlik ile başarısız

CoInitializeSecurity(NULL, -1, NULL, NULL, 
         RPC_C_AUTHN_LEVEL_PKT_PRIVACY, 
         RPC_C_IMP_LEVEL_IDENTIFY, 
         NULL, EOAC_NONE, NULL); 

arabirimler sıraya önce başlatıldı veya unmarshalled edilmelidir. bir zamanlar başlatıldı değiştirilemez.)

Ben fonksiyonuile ithal edilir VB6 programı ihraç işlevini çalıştırmak.

Hata, VB6 programının zaten CoInitializeSecurity olarak adlandırıldığı anlamına mı geliyor? Hataya karşı ne yapabilirim?

Ayrıca, başka bir sorum var: neden tam olarak güvenlik değerleri RPC_C_AUTHN_LEVEL_PKT_PRIVACY ve RPC_C_IMP_LEVEL_IDENTIFY seçildi? Diğer ayarların etkisi nedir?

cevap

11

bir DLL dosyasında bulunmayan bir çift standart COM çağrısı vardır. CoInitializeEx() gibi, bir iş parçacığı için COM'u başlatan çağrı. DLL iş parçacığı sahip değil, EXE seçilen daire durumunu geçersiz kılmak için güçsüzdür.

CoInitializeSecurity() başka bir tanedir, bu dosyayı çağırmak EXE'dir. Sadece uygun değerlerin geçeceğini biliyor, güvenlik politikasını belirleyen odur. Bir DLL, istemci işlemi hakkında hiçbir şey bilmiyor.

+0

Tamam, açıklığa ihtiyacım var burada ... (1) EXE hangi uygun değerleri biliyor ve DLL çalışmıyor? Bir EXE olarak derlenmiş proje DLL ile tam olarak aynı değerleri kullanıyorsa, neden doğru değil? "CoInitializeSecurity" parametrelerinde benzersiz bir kimlik bile yok ... (2) Bu soruna nasıl girebileceğimi ve DLL'den birim gölge kopyalarını nasıl başlatabileceğime dair herhangi bir fikriniz var mı? DLL'nin şu anki durumu yalnızca orta düzeydedir; Ben sadece genel bir VSS DLL yazmak için çalışıyorum. –

+0

Oldukça basit, DLL birden çok işlem tarafından kullanılabilir. İhtiyaç duyduğu güvenlik bağlamını belirleyen * süreçtir. Bunu unutmanızı şiddetle tavsiye ederim, COM güvenliği, DCOM dışı senaryolarda doğru ve büyük ölçüde ilgisizdir. –

+0

@Hans: Patronum, "birim gölge kopyalarını oluşturabilen bir DLL yaz" dememi istedi ... ve bunu yapabilen DLL dosyalarını duydum, bir yolu olmalı! –

İlgili konular