فراخوانی توابع یک COM Object از داخل Thread در یک x64 App
سلام
یک dll از یک COM Object دارم که میخوام توابع اون رو در داخل Thread فراخوانی کنم.
یک کلاس برای پیاده سازی Thread خودم نوشتم و COM Object رو داخل اون Create کردم. میخوام که با Resume کردن Thread در داخل تابع Execute توابع اون رو فراخوانی کنم.
سناریوهای زیر بوجود اومده:
1- وقتی برنامه 32 بیتی کامپایل میشه، موقع اجرای کام که می رسه پیغام زیر میاد:
Error getting data conversion flag
2- وقتی برنامه 64 بیتی باشه، پیغام زیر میاد:
CoInitialized has not been called
3- در حالت 64 بیتی، اگه قبل از فراخوانی توابع کام در Execute تابع CoInitialize رو با پارامتر nil فراخوانی کنم، پیغام بصورت زیر عوض میشه:
the application called an interface that was marshalled for a different thread
متوجه نشدم مشکل از کجاست؟
توضیح اینکه وقتی بخواهی با این dll در Thread اصلی برنامه کار کنی، مشکلی پیش نمیاد و توابع به خوبی اجرا میشه ... ! اما وقتی بخواهی داخل Thread باهاش کار کنی، مشکل بوجود میاد.
حتی این تست رو هم زدم که از داخل execute، شی کام ساخته شده در Main (و نه اون شی کامی که داخل Thread درست شده) رو فراخوانی بکنم، اما به این شکل فقط در حالت 32 بیتی اجرا میشه و در حالت 64 بیتی مشکل داره ... !؟
نقل قول: فراخوانی توابع یک COM Object از داخل Thread در یک x64 App
هر Thread قبل از استفاده از COM Object ها باید یک بار CoInitialize رو فراخوانی کنه، در ترد اصلی برنامه این کار به صورت خودکار انجام میشه، پس چه در حالت 32 بیت و چه در حالت 64 بیت باید در ابتدای متد Execute اون رو فراخوانی کنید
عموما COM Object ها به صورت Single-Thread کار می کنن، پس عموما نباید یک COM Object رو در یک ترد بسازید و در ترد دیگه ای استفاده کنید، توجه کنید که برای یک ترد، متد Create مربوط به کلاس TThread در ترد اصلی اجرا میشه، اگر متد Create کلاس ترد رو بازنویسی کردید و COM Object رو هم در متد Create ساختید، پس در ترد اصلی ساخته شده، باید در بدنه متد Execute اون رو بسازید
تفاوت عمده حالت های 32 و 64 بیت در سایز Pointer هستش و با توجه به پارامترهای ورودی توابع و نحوه آدرس دهی و سایر مواردی که با اشاره گرها ارتباط داره، امکان داره در یکی از این دو حالت با خطا مواجه بشید و باید این مورد رو درنظر داشته باشید و همینطور مطمئن بشید که توابع داخلی اون COM Object اگر پارامتر از نوع اشاره گر دارند، آیا 32 بیتی یا 64 بیتی بودن اون رو مدیریت می کنن یا خیر
نقل قول: فراخوانی توابع یک COM Object از داخل Thread در یک x64 App
نقل قول: فراخوانی توابع یک COM Object از داخل Thread در یک x64 App
یا تشکر از جناب Mahmood_M مشکل از همون جایی بود که فرموده بودید؛ در واقع من تو Constructor کلاس Thread شی کام رو ساخته بودم و وقتی اون رو به اول تابع Execute منتقل کردم، مشکل حل شد.
جالبه که دیگه نیازی به فراخوانی CoInitialize هم نیست!
ممنون