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

نام تاپیک: خطا تغییر اندازه متغیر نوع آرایه ای در DLL

  1. #1

    خطا تغییر اندازه متغیر نوع آرایه ای در DLL

    سلام
    یه تابع داخل dll نوشتم که یه نوع رکورد که خودم تعریف کردم رو به عنوان ورودی میگیره . این نوع رکورد یکی از اجزاش خودش یک آرایه هست .

    ObjectType=record
    Xs:Array of double;

    function MyFunction(var TheObject:ObjectType):boolean;stdcall;
    begin
    setlength(TheObject.Xs,10);
    end;
    مشکلی که وجود داره اینه که تغییر سایز اعمال میشه ولی در نهایت زمانیکه برنامه رو میبندم خطا میده .
    لطفا راهنمایی بفرمایید .
    با تشکر .

  2. #2

    نقل قول: خطا تغییر اندازه متغیر نوع آرایه ای در DLL

    شما دارید از آرایه دینامیک که یک نوع داده اختصاصی دلفی هست، و به طور خودکار حافظه آن مدیریت میشه، استفاده می کنید. در یک DLL نباید از نوع های داده اختصاصی زبان برنامه نویسی بخصوصی استفاده کنید، چون در اون صورت، فقط زبان های برنامه نویسی که اون نوع داده خاص را بشناسند، می تونند باهاش کار کنند. در این مورد، یعنی فقط برنامه های نوشته شده با دلفی می تونند از اون DLL استفاده کنند.

    حتی در صورتی که برنامه و DLL هر دو با دلفی نوشته شده باشند، استفاده از آرایه دینامیک به اون شکل اشتباه هست، چون برنامه شما و DLL شما هر کدام مدیر حافظه مستقلی دارند. شما که در داخل DLL آرایه را مقداردهی می کنید، مدیر حافظه موجود در DLL مقدار Reference counter آن آرایه را افزایش میده، در حالی که مدیر حافظه برنامه استفاده کننده از اون DLL اطلاعی از این موضوع نداره. این مسئله نهایتا منجر به بروز رفتارهای عجیب و غریب و خطاهای مرتبط با حافظه میشه.

    باید سعی کنید در وهله اول، از استفاده از این نوع داده های اختصاصی در DLLها تا حد امکان خودداری کنید. اگر لازم هست که حتما از آنها استفاده کنید، و برنامه به کار گیرنده DLL و خودِ DLL هر دو توسط شما توسعه داده میشند، اون وقت می تونید به مدیر حافظه دلفی بفهمونید که باید به طور مشترک بین برنامه و DLL مربوطه عمل کنه، تا یک مدیر حافظه بر عملکرد هر دو ماجول نظارت داشته باشه. برای این کار، باید یونیت SimpleShareMem را به ابتدای لیست uses فایل dpr هر دو پروژه اضافه کنید، و هر دو پروژه را مجددا کامپایل کنید.

    در ضمن، نیازی به اون stdcall نیست؛ اون موقعی کاربرد داره که شما بخواید DLL تان را برای استفاده سایر زبان های برنامه نویسی کامپایل کنید، ولی با توجه به استفاده شما از آرایه دینامیک، استفاده از DLL شما در سایر زبان های برنامه نویسی معنی نداره، پس stdcall کاربردی نداره، و فقط باعث کاهش کارایی برنامه تان میشه.


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

برچسب های این تاپیک

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

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