نمایش نتایج 1 تا 4 از 4

نام تاپیک: فراخوانی توابع یک COM Object از داخل Thread در یک x64 App

  1. #1

    فراخوانی توابع یک 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 بیتی مشکل داره ... !؟

  2. #2

    نقل قول: فراخوانی توابع یک 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 بیتی بودن اون رو مدیریت می کنن یا خیر

  3. #3
    محروم شده
    تاریخ عضویت
    تیر 1396
    محل زندگی
    تهران
    پست
    45

    نقل قول: فراخوانی توابع یک COM Object از داخل Thread در یک x64 App

    کاملا درست میگویید

  4. #4

    نقل قول: فراخوانی توابع یک COM Object از داخل Thread در یک x64 App

    یا تشکر از جناب Mahmood_M مشکل از همون جایی بود که فرموده بودید؛ در واقع من تو Constructor کلاس Thread شی کام رو ساخته بودم و وقتی اون رو به اول تابع Execute منتقل کردم، مشکل حل شد.

    جالبه که دیگه نیازی به فراخوانی CoInitialize هم نیست!

    ممنون

تاپیک های مشابه

  1. سوال: روش فراخوانی توابع یک فایل در یک فایل دیگر از جاوا اسکریپت
    نوشته شده توسط BAHAR1394 در بخش ASP.NET MVC
    پاسخ: 1
    آخرین پست: سه شنبه 26 بهمن 1395, 10:16 صبح
  2. سوال: دسترسی به اشیاء یک Thread از داخل Thread دیگر
    نوشته شده توسط bah_jaf در بخش VB.NET
    پاسخ: 1
    آخرین پست: چهارشنبه 29 آبان 1387, 20:35 عصر
  3. اجرای یک برنامه از داخل برنامه در حال اجرا
    نوشته شده توسط poorya.pzm در بخش برنامه نویسی در Delphi
    پاسخ: 2
    آخرین پست: شنبه 31 شهریور 1386, 02:41 صبح
  4. فراخوانی توابع یک سرویس وب در VC و در ویندوز 98
    نوشته شده توسط zrahimic در بخش برنامه نویسی با زبان C و ++C
    پاسخ: 0
    آخرین پست: یک شنبه 14 اسفند 1384, 12:54 عصر
  5. تغییر اندازه report object از داخل برنامه
    نوشته شده توسط rezaei manesh در بخش گزارش سازی با Crystal Report
    پاسخ: 0
    آخرین پست: چهارشنبه 05 اسفند 1383, 10:25 صبح

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •