PDA

View Full Version : dll و خطاي EInvalidCast



beginner63
دوشنبه 06 آبان 1387, 15:02 عصر
سلام. تابعي نوشتم كه وقتي در دلفي هست و اجراش ميكنم بدون مشكل اجرا ميشه
اما زماني كه به يه dll انتقالش ميدم و فراخوانيش ميكنم پيغام زير روميده:


http://i37.tinypic.com/vy5wza.jpg


اين هم تعريف تابع هست:

procedure InsertIntoPersP(sp:TADOStoredProc; edpercod, edname, edfamily, edss,
cmbMadrak, cmbOnvanmadrak, cmbComp, cmbUnit, cmbSemat, edSdate, edPdate,
edGno, edSno, edTcount, edComm:AnsiString; cbEndk, cbTvr, cbMom:Boolean);

مطمئنا مشكل نميتونه توي بدنه تابع باشه چون هنگام استفاده در خود برنامه جواب ميده

لطفا راهنمايي كنيد. تشكر

vcldeveloper
سه شنبه 07 آبان 1387, 02:36 صبح
مطمئنا مشكل نميتونه توي بدنه تابع باشه چون هنگام استفاده در خود برنامه جواب ميده
چیزی که در برنامه ایی درست کار میکنه، لزوما در DLL درست کار نمیکنه!

1- استفاده از AnsiString در DLL اشتباه هست، غیر از آنکه اقدامات لازم برای استفاده از رشته های بلند دلفی در DLL را انجام داده باشید (ShareMem).

2- از اون sp:TADOStoredProc در کد به چه شکلی استفاده کردید؟ احتمالا مشکل اصلی باید این انتقال شی از برنامه به DLL باشه. دلیل مشکلش را که مربوط به Heap در برنامه و DLL بود، همین چند وقت پیش در یک تاپیک دیگه گفتم. البته بستگی به نوع استفاده شما ازش هم داره. در هر حال، بجای TAdoStoredProc از Pointer استفاده کنید، و سعی کنید Pointer را بعدا در کد به کلاس مورد نظرتان Typecast کنید، و ببینید آیا مشکل را برطرف میکنه یا نه.

اگر نکرد، سورس پیاده سازی تابع در DLL، و فراخوانی تابع از داخل برنامه را هم بزارید.

beginner63
چهارشنبه 08 آبان 1387, 11:43 صبح
1- استفاده از AnsiString در DLL اشتباه هست، غیر از آنکه اقدامات لازم برای استفاده از رشته های بلند دلفی در DLL را انجام داده باشید (ShareMem)
sharemem در هر دو پروژه استفاده شده. ضمن اينكه نتيجه كار با string هم فرقي نكرد


در هر حال، بجای TAdoStoredProc از Pointer استفاده کنید، و سعی کنید Pointer را بعدا در کد به کلاس مورد نظرتان Typecast کنید، و ببینید آیا مشکل را برطرف میکنه یا نه.
لطفا بيشتر توضيح بديد. تشكر

vcldeveloper
چهارشنبه 08 آبان 1387, 17:12 عصر
ضمن اينكه نتيجه كار با string هم فرقي نكردAnsiString و string در دلفی های قبل از دلفی 2009 یکی هستند.


procedure MyProc(Object: Pointer);
var
AdoConnection : TAdoConnection;
begin
if Assigned(Object) then
begin
AdoConnection := TAdoConnection(Object);
...
end;
end;
راه دیگه هم این هست که از Package بجای DLL استفاده کنید. درباره اش قبلا صحبت کردیم. درباره Type-Cast و همین مشکلی که شما دارید هم چند وقت پیش در سایت صحبت کردیم.

beginner63
یک شنبه 12 آبان 1387, 08:00 صبح
يعني طبق تابعي كه گفتيد، بايد adodataset رو به عنوان پارامتر به تابع بفرستم و بعد از شيء adoconnection به عنوان adodataset استفاده كنم؟


راه دیگه هم این هست که از Package بجای DLL استفاده کنید
به خاطر قابل حمل بودن dll ترجيح ميدم از همين dll استفاده كنم


درباره Type-Cast و همین مشکلی که شما دارید هم چند وقت پیش در سایت صحبت کردیم.
من جستجو كردم اما نتيجه اي كه به مشكل من مربوط بشه رو نديدم. اگر ممكنه لينك تاپيك رو بگذاريد
تشكر

vcldeveloper
یک شنبه 12 آبان 1387, 18:23 عصر
يعني طبق تابعي كه گفتيد، بايد adodataset رو به عنوان پارامتر به تابع بفرستم و بعد از شيء adoconnection به عنوان adodataset استفاده كنم؟
نه، شی را به عنوان pointer ارسال می کنید، بعد هم آن Pointer را به همون کلاسی که هست Type-Cast می کنید، نه اینکه AdoDataSet را به AdoConnection تبدیل کنید!



به خاطر قابل حمل بودن dll ترجيح ميدم از همين dll استفاده كنم
قابل حمل بودن به کجا؟ شما دارید مستقیما از اشیاء دلفی استفاده می کنید، انتظار نداشته باشید که تابعی که فرضا TAdoConnection را به عنوان پارامتر دریافت میکنه، در سایر زبان ها کار کنه!


من جستجو كردم اما نتيجه اي كه به مشكل من مربوط بشه رو نديدم. اگر ممكنه لينك تاپيك رو بگذاريد
الان حضور ذهن ندارم. اون تاپیک هم درباره این بود که چرا وقتی یک شی در DLL درست میشه و به برنامه اصلی پاس داده میشه، نمیشه باهاش کار کرد.