PDA

View Full Version : سوال: امکان بدست آوردن تمام Memberهای پیاده سازی شده برای یک OleVariant در حین اجرا؟



SAASTN
سه شنبه 13 اردیبهشت 1390, 15:18 عصر
من دارم از طریق Automation برای AutoCad کد می نویسم. Cad میاد اشیاء رو بصورت OleVariant در اختیار میذاره. مشکل اینجاست که برنامه من قراره با اشیاء ایجاد شده توسط یه برنامه دیگه کار کنه، اون برنامه هم Documentی که مشخصات اشیائش رو توضیح بده منتشر نکرده. منم برای دسترسی به یه سری مشخصات خاص هر نام رایجی که به نظرم میرسید تست کردم ولی جواب نداد.
حالا سوال اینجاست که آیا میشه در حین اجرا لیستی از تمام متدها و Property های پیاده سازی شده برای شیئی که داخل یه OleVarian هست رو بدست آورد؟

یوسف زالی
سه شنبه 13 اردیبهشت 1390, 15:33 عصر
GetPropList روش جواب نمی ده؟

SAASTN
سه شنبه 13 اردیبهشت 1390, 15:56 عصر
خیر، من که نتونستم ازش استفاده کنم.

یوسف زالی
سه شنبه 13 اردیبهشت 1390, 16:10 عصر
تو دلفی ازش handle می شه گرفت؟
یا اونم داستانیه؟

SAASTN
سه شنبه 13 اردیبهشت 1390, 16:33 عصر
این اشیا، ویندوزی نیستن که Handle به اون صورت مد نظر شما داشته باشن، یه سری اشیای ترسیمی هستند مثل خط، دایره و ...

vcldeveloper
سه شنبه 13 اردیبهشت 1390, 20:12 عصر
حالا سوال اینجاست که آیا میشه در حین اجرا لیستی از تمام متدها و Property های پیاده سازی شده برای شیئی که داخل یه OleVarian هست رو بدست آورد؟
مسئله شما OleVariant نیست. وقتی از Automation استفاده می کنید، و یک شی برگشت داده میشه، این کار از طریق IDispatch صورت میگیره. در واقع شی مورد نظر شما به صورت یک IDsipatch در اون متغیر OleVariant برگشت داده شده. وقتی در زمان اجرا متدی را به این شی برگشتی نسبت میدید، از طریق اینترفیس IDispatch، نام این متد به IDispatch.GetIDsOfNames ارسال میشه، تا ID اون متد به دست بیاد. اگر متدی با اون نام برای اون شی وجود داشت، اون وقت IDispatch.Invoke برای اجرای اون متد خاص فراخوانی میشه. این میشه فراخوانی به صورت late-binding.

حالا، اگر Automation Object مورد نظر شما Type Library ایی رو به شما ارائه کرده باشه، می تونید اون Type Library رو Import کنید، و در اون صورت، با cast کردن مقدار ذخیره شده در OleVariant به اینترفیس مورد نظر خودتون در اون Type Library، می تونید به صورت early-binding متدهای اون رو فراخوانی کنید یا به خصوصیاتش دسترسی داشته باشید.

اگر به Type Library دسترسی ندارید، و مستنداتی هم برای استفاده از اون Automation Object وجود نداره، دقیقا نمیدونم که چیکار می تونید بکنید. فقط میدونم که IDispatch یک متد با نام GetTypeInfo داره، که اطلاعات مربوط به اون تایپ خاص رو برگشت میده. البته نمیدونم دقیقا به چه شکلی این اطلاعات برگشت داده میشه. شاید به صورت ITypeInfo برگشت داده میشه.

SAASTN
چهارشنبه 14 اردیبهشت 1390, 09:15 صبح
در واقع شی مورد نظر شما به صورت یک IDsipatch در اون متغیر OleVariant برگشت داده شده.
علی آقا بازم ممنون، قضیه همین بود که یه مسیر اشتباه رو داشتم می رفتم که هرچی می گشتم چیزی پیدا نمی کردم.

فقط میدونم که IDispatch یک متد با نام GetTypeInfo داره، که اطلاعات مربوط به اون تایپ خاص رو برگشت میده. البته نمیدونم دقیقا به چه شکلی این اطلاعات برگشت داده میشه. شاید به صورت ITypeInfo برگشت داده میشه.
اینجا یکی همین مسئله رو پیاده سازی کرده:
http://www.delphi3000.com/articles/article_2586.asp?SK=
یه IDispatch میگیره و تمام Member ها شو تو یه StringList بر می گردونه.

ولی مسئله ما که حل نشد، نمی دونم اون کثافت مرض دیتایی که می خوام رو کجا برده نگه داشته، الان با همین متد DocumentIDispatch که توی لینک بالا بود تمام اعضای شیئم رو بدست میارم ولی هیچ چیز جدیدی نسبت به اشیائ پیش فرض Cad ایجاد نشده. کم کم باید برم دنبال یه ارتفاع مناسب بگردم.:عصبانی++:

mehdi.mousavi
چهارشنبه 14 اردیبهشت 1390, 12:19 عصر
سلام.
شما می تونید با استفاده از OLE Object Explorer (http://ole-com-object-explorer.findmysoft.com/download/#)، اقدام به Browse کردن DLL، OCX، TLB و بطور کلی کلیه Typelib ها کنید. اینطوری می تونید ببینید که Interface ها، Struct ها، CoClass ها و ... چگونه در اون COM Server تعریف شده اند و از اینجا به ارتباطات کلاس ها (البته به سختی) و پیاده سازی Interface ها و CLSID ها و ... پی ببرید.

موفق باشید.

SAASTN
چهارشنبه 14 اردیبهشت 1390, 19:49 عصر
اقدام به Browse کردن DLL، OCX، TLB و بطور کلی کلیه Typelib ها
ممنون، نرم افزار جالبی بود، ولی توی لیستاش اون کلاس ها رو ندیدم. با این که اشیاء پیش فرض خود اتوکد لیست شده بود. متاسفانه اون نرم افزاری هم که باهاش کار می کنم هیچ DLL یا OCX یا ... در اختیار نذاشته و من هم چیزی پیدا نکردم. اگه داشت که با خود دلفی یا بقیه ابزار ها لودش می کردم.
حالا یه سوال دیگه: ببینید اتوکد نرم افزار خیلی بازیه و راههای تعامل زیادی داره. حالا به نظر شما میشه مشخصات یه کلاس جدید رو به یه روشی مثلا از طریق یه فایل متنی به اوتوکد معرفی کرد و اون خودش بتونه بقیه کارها رو انجام بده یا یه همچین چیزی از اساس با ماهیت کلاس ها منافات داره و حتما یه TypeLibی، حالا در یکی از قالب های DLL یا OCX یا ...، این وسط باید تعریف شده باشه؟