Visual Basic'te, ana iş parçacığı dışında başka bir iş parçacığından ActiveX bileşeni tarafından harekete olay bazen bir geçersiz sayfa hatası (BAşLATMA) veya (GPF) genel koruma hatasına neden olur. Genellikle Visual Basic ıDE'DE bağdaştırıcımla görünüyor ancak bağımsız EXE çalıştırıldığında başarısız oluyor.
Visual Basic bir bir apartman iş parçacığı modelini kullanır. Siteler-iş parçacığı işlev çağrıları sıraya gerekir. Visual Basic sıralanırken olmadan bir Visual Basic projesi tarafından oluşturulan bir ana iş parçacığı dışında başka bir iş parçacığından doğrudan harekete olayları desteklemiyor.
Coınitialize/CoUnInitialize çağrısı gerekiyor spun iş parçacığı.
Geri üzerinde iş parçacığının ça?r?lan havuzu arabirimi üzerinden CoMarshalInterThreadInterfaceInStream/CoGetInterfaceAndReleaseStream ile bir iş parçacığı için sıraya gerekir.
Ikincil bir iş parçacığından olay tetikleme, yerine geri ana iş parçacığına ileti postalama ve olayı vardır. Bu makalenin sonraki bölümlerinde, bu yöntemi örneği verilmiştir.
Aşağıdaki örnekte, ilk ATL projesinde, bir Visual Basic 6. 0'ın proje oluşturur. Sonra bu birincil iş parçacığı, bir olayı harekete ikincil bir iş parçacığının isteği için uygun bir şekilde göstermek için kullanır.
Visual C++ ile bir ATL proje oluşturmak için gereken adımları
Bir yeni ATL COM AppWizard MyAtlDll adlı proje oluşturmak ve varsayılan ayarları saklamak.
Sınıf görünümünde proje adını sağ tıklatın ve ATL nesne seçin. Basit bir nesne görüntülenen iletişim kutusunda seçin ve ileri'yi tıklatın. "Içinde MyAtl" C++ kısa adı olarak yazın. Öznitelik sekmesini tıklatın ve bağlantı noktaları Destek'i seçin. Tamam'ı tıklatın ve yeni ATL nesnesi olarak eklenir.
Sınıf görünümündeki IMyAtl sağ tıklatın ve Ekle yöntemi. "InitTask", "[,] uzun numarası" ve yöntem adı metin kutusuna parametreleri</a1> metin kutusuna yazın. Tamam'ı tıklatın.
Sınıf görünümündeki _IMyAtlEvents sağ tıklatıp Ekle yöntemi. Dönüş türü açılan kutuda "void" seçin. "TaskFinished", "[,] uzun sonucu" ve yöntem adı metin kutusuna parametreleri</a1> metin kutusuna yazın. Tamam'ı tıklatın.
Sınıf görünümündeki CMyAtl'ı sağ tıklatın ve sonra Ekle üye değişkeni seçin. "Uzun" değişken tipi, metin kutusunu ve "m_number" <a0>değişken adı</a0> metin kutusuna yazın.
Adım 10'için gerekli tür kitaplığı oluşturmak için bir proje oluşturun.
Sınıf görünümündeki genişletin ve CMyAtl IMyAtl InitTask->->'ı çift tıklatın. Aşağıdaki gibi görünmesini sağlamak için InitTask işlevini düzenleyin:
DWORD WINAPI justDoIt(LPVOID lpParameter)
{
CMyAtl *myAtl = (CMyAtl*)lpParameter;
long result;
for (int i = 1; i <= myAtl->m_number; ++i)
result = i * 2;
myAtl->Fire_TaskFinished(result);
return 0;
}
Satırı sağ üstünde aşağıdaki kodu ekleyin "#endif //__MYATL_H_" MyAtl.h dosyasındaki:
DWORD WINAPI justDoIt(LPVOID lpParameter);
Sınıf görünümündeki CMyAtl'ı sağ tıklatın ve bağlantı noktası gerçekleştir'i seçin. _IMyAt olayları görüntülenen iletişim kutusunda seçin. Tamam'ı tıklatın.
ATL Projeyi derleyin ve denetimi otomatik olarak kaydedilir.
Yeni bir standart exe DOSYASı) projesi oluşturun. Varsayılan olarak, Form1 oluşturulur.
Başvurular Proje menüsünde seçin seçin "MyAtlDll 1.0 tür kitaplığı," Tamam'ı tıklatın.
Forma bir KomutDüğmesi ekleyin ve varsayılan adı korunarak (command1).
Form1 <a1>Kod</a1> penceresine aşağıdaki kodu ekleyin:
Option Explicit
Private WithEvents vbATL As MYATLDLLLib.MyAtl
Private Sub Command1_Click()
vbATL.InitTask 11111
End Sub
Private Sub Form_Load()
Set vbATL = New MYATLDLLLib.MyAtl
End Sub
Private Sub vbATL_TaskFinished(ByVal result As Long)
MsgBox result
End Sub
Proje çalıştırmak için F5 tuşuna basın. Command1'ı tıklatın ve bir ileti kutusu içinde 22222 alırsınız.
IDE dışında EXE bir EXE olması ve bir proje oluşturun. KomutDüğmesi tıklattığınızda bir hata iletisi alırsınız.
Not bazen işe yarayabilir, ancak tutarlı bir şekilde çalışmaz. Belirli bu örnekte sorunu gidermek için <a0></a0>, CWindowImpl the CMyAtl türetme yapıp yapmayacağınızı ve bir ileti eşlemesi eklemek gerekir. Pencere gizli olmasına dikkat edin. Şimdi, ikincil iş parçacığının bir olaydan tetikleme yerine nakledebilir ana iş parçacığına bir ileti ve ileti işleyicisindeki olayı.
Ikinci bir iş parçacığından olay tetikleme ve PostMessage yöntem hakkında ek bilgi için Microsoft Knowledge Base'deki makaleleri görüntülemek üzere aşağıdaki makale numaralarını tıklatın:
157437
(http://support.microsoft.com/kb/157437/EN-US/
)
FILE: İkinci bir iş parçacığı Fireev.exe geçirilir olayları
280512
(http://support.microsoft.com/kb/280512/EN-US/
)
Örnek: COM arasında tetikleme ATL olay ATLCPImplMT saklar.
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:196026
(http://support.microsoft.com/kb/196026/en-us/
)
Bu makaleyi kullanmak için ne kadar kişisel çaba harcadınız?
Çok az
Az
Orta
Fazla
Çok fazla
Bu bilgiyi geliştirmemiz için nedenleri ve bu konuda neler yapabileceğimizi paylaşın
Teşekkürler! Görüşleriniz, destek içeriğimizi geliştirmemize yardımcı olmak için kullanılmaktadır. Diğer yardım seçenekleri için, lütfen Yardım ve Destek Giriş Sayfasını ziyaret edin.