PDA

View Full Version : سوال: مشکل با فایل ساخته شده دلفی 2010



nsco_nsco
چهارشنبه 17 فروردین 1390, 15:28 عصر
سلام دوستان عید گذشته شما مبارک و امیدوارم سال خوبی داشته باشید
یک مشکلی برام به وجود امده من یک فایل اگزه ساختم که یک سری اطلاعات از یک دی ال ال می گیره که اون دی ال ال هم خودم ساختم بعد از ساختن رفتم روی سیستم که دلفی نیست و خواستم فایل اگزه م رو باز کنم که ارور می داد و بازش نمی کرد و می گفت نیاز به دی ا ل ال borlndmm.dll هست از اینترنت هم گرفتم باز باز نشود ممنون می شوم بگید مشکل کجاست با تشکر از همه دوستان (( لطفا سریع یاری برسانید با تشکر)):تشویق::قلب:

BORHAN TEC
چهارشنبه 17 فروردین 1390, 15:40 عصر
موقعی که در حال ساخت dll هستید به جای استفاده از یونیت ShareMem از یونیت SimpleShareMem استفاده کنید. همچنین در ساخت فایل exe هم یونیت SimpleShareMem را به ابتدای فهرست یونیت ها در یونیت اصلی پروژه اضافه کنید.

nsco_nsco
پنج شنبه 18 فروردین 1390, 07:26 صبح
سلام ممنون از پاسختون این ارور بعد از تغییراتی که گفتید داده می شود :
the memory manager cannot be changed after it has been used.
ممنون می شوم سریع پاسخ بدید با تشکر:قلب:

BORHAN TEC
پنج شنبه 18 فروردین 1390, 09:43 صبح
با این روشی که گفتم نباید مشکلی پیش بیاد. ولی اگر از فراخوانی دینامیک dll ها استفاده می کنید حتماً و حتماً باید یونیت SimpleShareMem را به ابتدای فهرست uses واقع در یونیت اصلی پروژه که مربوط به فایل exe میشود اضافه کنید و اگر قبلاً یونیت ShareMem را به این فهرست اضافه کرده اید باید یونیت ShareMem را از فهرست uses حذف کنید به عبارتی دیگر نباید SimpleShareMem را همراه با ShareMem به کار ببرید. این یک مثال که برایتان آماده کرده ام که از فراخوانی استاتیک استفاده می کند. البته خودم در بیشتر موارد سعی می کنم که به جای SimpleShareMem از یونیت FastShareMem استفاده کنم. یونیت FastShareMem به همراه دلفی عرضه نمی شود، بلکه باید آن را با جستجو در اینترنت پیدا کنید.

nsco_nsco
پنج شنبه 18 فروردین 1390, 18:31 عصر
سلام ممنون از پاسختون من هم استفاده به همین صورت می کنم ولی باز مشکل به وجود میاد بیشتر در فایل اگزه با قرار دادن SimpleShareMem خیلی در اینترنت برای دانلود FastShareMem گشتم ولی پیدا نکردم ممنون می شوم این فایل رو قرار بدید وبگید چطوری نصبش کنم و بتونم ازش استفاده کنم با تشکر از شما ممنون می شوم سریع پاسخ بدید :قلب:

vcldeveloper
پنج شنبه 18 فروردین 1390, 20:02 عصر
در اینترنت برای دانلود FastShareMem گشتم ولی پیدا نکردم ممنون می شوم این فایل رو قرار بدید
کمکی به شما نمیکنه؛ FastShareMem زمانی به درد میخورد که SimpleShareMem و FastMM نبودند. با وجود SimpleShareMem دیگه نیازی به استفاده از FastShareMem نیست؛ پس وقت خودتون رو برای پیدا کردن اون تلف نکنید.


ولی اگر از فراخوانی دینامیک dll ها استفاده می کنید حتماً و حتماً باید یونیت SimpleShareMem را به ابتدای فهرست uses واقع در یونیت اصلی پروژه که مربوط به فایل exe میشود اضافه کنید
چه فراخوانی استاتیک باشه، و چه دینامیک، باید SimpleShareMem هم در DLL و هم در برنامه، به عنوان اولین یونیت لیست uses در فایل DPR پروژه باشه.

nsco_nsco
جمعه 19 فروردین 1390, 15:48 عصر
سلام ممنون از پاسختون اما من زمانی که در فایل اگزه SimpleShareMem رو در اول هم قرار می دم باز همون ارور رو میده ممنون می شم بگید چرا :
the memory manager cannot be changed after it has been used. با تشکر

BORHAN TEC
جمعه 19 فروردین 1390, 17:49 عصر
کمکی به شما نمیکنه؛ FastShareMem زمانی به درد میخورد که SimpleShareMem و FastMM نبودند. با وجود SimpleShareMem دیگه نیازی به استفاده از FastShareMem نیست؛ پس وقت خودتون رو برای پیدا کردن اون تلف نکنید.

من این سخن شما را قبول ندارم!!! قبلاً در کار با dll ها به مشکلاتی برخورد کرده بودم که SimpleShareMem هیچ کمکی به من نمی کرد ولی موقعی که بجای آن از FastShareMem استفاده کردم، مشکل به کلی برطرف شد. که البته این مساله برای من هم بسیار عجیب بود و به نظر من استفاده از FastShareMem بهتر است.

چه فراخوانی استاتیک باشه، و چه دینامیک، باید SimpleShareMem هم در DLL و هم در برنامه، به عنوان اولین یونیت لیست uses در فایل DPR پروژه باشه.
باز هم من نظری متفاوت دارم!!! در عمل اگر در برنامه خود از فراخوانی استاتیک استفاده می کنید نیازی نیست که یونیت مزبور را به ابتدای فهرست uses مربوط به یونیت اصلی پروژه مربوط به برنامه exe اضافه کنید. این مطلب را می توانید تست کنید. البته به نظر من این مساله زیاد هم مهم نیست. برای راحتی کار در عمل می توان اینگونه تصور کرد که یونیت مذکور را باید در هر دو پروژه اضافه کنیم. :لبخندساده:

سلام ممنون از پاسختون من هم استفاده به همین صورت می کنم ولی باز مشکل به وجود میاد بیشتر در فایل اگزه با قرار دادن SimpleShareMem خیلی در اینترنت برای دانلود FastShareMem گشتم ولی پیدا نکردم ممنون می شوم این فایل رو قرار بدید وبگید چطوری نصبش کنم و بتونم ازش استفاده کنم با تشکر از شما ممنون می شوم سریع پاسخ بدید
نیازی به نصب ندارد. طریقه استفاده از آن مثل یونیت های دیگر است. این یونیت را در همین پست ضمیمه کرده ام.

BORHAN TEC
جمعه 19 فروردین 1390, 17:56 عصر
سلام ممنون از پاسختون اما من زمانی که در فایل اگزه SimpleShareMem رو در اول هم قرار می دم باز همون ارور رو میده ممنون می شم بگید چرا :
the memory manager cannot be changed after it has been used. با تشکر
اگر امکان دارد برنامه خود ضمیمه کنید.

vcldeveloper
جمعه 19 فروردین 1390, 20:16 عصر
باز هم من نظری متفاوت دارم!!! در عمل اگر در برنامه خود از فراخوانی استاتیک استفاده می کنید نیازی نیست که یونیت مزبور را به ابتدای فهرست uses مربوط به یونیت اصلی پروژه مربوط به برنامه exe اضافه کنید. این مطلب را می توانید تست کنید. البته به نظر من این مساله زیاد هم مهم نیست. برای راحتی کار در عمل می توان اینگونه تصور کرد که یونیت مذکور را باید در هر دو پروژه اضافه کنیم.
دو ماجول مختلف که از مدیر حافظه های مختلفی استفاده می کنند، چه به صورت دینامیک لود بشند، و چه به صورت استاتیک؛ می تونند فضای آدرس پروسه رو خراب کنند. چون وقتی یک مدیر حافظه داره شی رو track میکنه، مدیر حافظه دیگه هیچ ایده ایی نداره که اصلا همچین شی ایی هست، و یک مدیر دیگه داره به امورش رسیدگی میکنه؛ پس اظهار نظر شما از نظر فنی اشتباه هست. اینکه شما در یک برنامه یا چند برنامه به مشکل بر نخورید، به معنی اون نیست که کار درستی انجام دادید. مثل این هست که به یکی بگیم کنار ظرف بنزین سیگار نکش، طرف هم بگه قبلا یک بار کشیدم، ظرف منفجر نشده! اگر یک بار به هر دلیلی ظرف منفجر نشده، به معنی اون نیست که مشکلی وجود نداره، بلکه مشکل هست، اما خودش را بروز نداده.



من این سخن شما را قبول ندارم!!! قبلاً در کار با dll ها به مشکلاتی برخورد کرده بودم که SimpleShareMem هیچ کمکی به من نمی کرد ولی موقعی که بجای آن از FastShareMem استفاده کردم، مشکل به کلی برطرف شد. که البته این مساله برای من هم بسیار عجیب بود و به نظر من استفاده از FastShareMem بهتر است.
تا اون مشکل چی باشه؛ هدف اصلی از استفاده از FastShareMem و SimpleShareMem به اشتراک گزاری یک مدیر حافظه مشترک بین DLL و یک برنامه استفاده کننده از DLL هست. کاری که FastShareMem میکنه، مربوط به قبل از FastMM هست. اون یونیت تمام درخواست های اختصاص حافظه دینامیک رو به یک جا redirect میکنه. کاری که SimpleShareMem میکنه، از اسمش هم مشخصه، خیلی ساده است، فقط یکی از Flag های FastMM رو True میکنه، چون FastMM به عنوان مدیر حافظه پیش فرض، از به اشتراک گذاشتن مدیر حافظه، به طور خودکار پشتیبانی میکنه، فقط کافیه بهش گفته بشه که آیا باید مدیر حافظه به اشتراک گذاشته بشه یا نه؟ پس این مورد شما هم صرفا یک مصادق از مشکلی بوده که معلوم نیست چی هست. بر فرض اینکه برنامه شما یک مشکل (ناشناخته) داشته، و با استفاده از FastShareMem مشکل شما ظاهرا برطرف شده که نمیشه گفت فلان ابزار از ابزار دیگه بهتر هست.



در فایل اگزه SimpleShareMem رو در اول هم قرار می دم باز همون ارور رو میده
در اول چی قرار می دید؟ در پست قبلی تاکید کردم که باید اول بخش uses فایل dpr پروژه باشه. در ضمن، فقط باید از یکی از این یونیت ها در پروژه استفاده کنید، یعنی اگر فرضا از SimeShareMem استفاده کردید، دیگه FastShareMem یا ShareMem نباید در لیست uses هیچکدوم از یونیت ها باشند.