Win32 Bugs  ..


باگهای ویندوز 32 بیتی 


I list here the known bugs in Win32, which may cause you  endless search, as the cause will neither be in your source, nor be the fault of RosAsm (Do not forget to report these last case bugs: I cannot fix bugs I never encountered nor heard about):


من در اینجا باگهای شناخته شده در ویندوز 32 بیتی را لیست می کنم که ممکن است باعث شود شما بی نهایت جستجو کنید ، نظر به اینکه باعث و بانی این باگ نه در سورس برنامه ی شما خواهد بود و نه باعث شکست روسسم می شود . ( فراموش نکنید که  این باگهای مورد آخر را گزارش دهید : من نمی توانم باگهایی که هرگز با آنها برخورد نکرده ام یا چیزی در موردشان نشنیده ام را  برطرف کنم. ) :



LoadIconA will fail if your resources size grows over 0FFFF. Do not store huge data in Resources.


تابع LoadIconA شکست می خورد اگر حجم فایلهای ریسورس برنامه هایتان بیش از عدد 0FFFF شود . داده های غول پیکر را در فایلهای ریسورس برنامه هایتان نگهداری نکنید  . 

( عدد 0FFFF یک عدد هگزادسیمال می باشد که می توانید با کمک نرم افزارهای مبدل ، آنرا به عدد دسیمال تبدیل کنید . منظور اینست که اگر حجم فایل ریسورس ( فایلهای با پسوند   RES  یا  RC   در زبانهای برنامه نویسی سطح بالا   و سطح پایین ) برنامه هایتان از این عدد بیشتر شود تابع مذکور که وظیفه ی بارگیری آیکون را دارد شکست خورده و نمی تواند آیکون برنامه تان را نمایش دهد . وحیدمی) 


Dialog problems (not really a Win32 bug, but rather a different behaviour that is difficult to point out on the two main OS families 95/98/ME vs NT/2000/XP).


مشکلات دیالوگ ( واقعا یک باگ وین32 نیست ، اما نسبتا یک رفتار متفاوت است که برای اشاره کردن به دو خانواده ی اصلی سیستم عامل ویندوز ، مشکل ایجاد می کند . خانواده ی ویندوز 9x  در مقابل خانواده ی ویندوزNT ) . 




There are two kinds of Dialogs the ''Modeless'' ones, that are created by CreateDialogParam / CreateDialogindirectParam and the ''Modal'' ones, that are created by DialogBoxParam / DialogBoxindirectParam


دو نوع از دیالوگها در ویندوز وجود دارند : انواع Modeless (آزاد) ، که توسط توابع CreateDialogParam   و  CreateDialogindirectParam   خلق شده اند  و انواع  Modal ( قانونی )  که توسط توابع DialogBoxParam و DialogBoxindirectParam ایجاد شده اند . 




The ''Modeless'' ones Returns immediately after running the Dialog (they give hand to the next coming code).

آن دیالوگهای آزاد ، فورا بعد از اجرای دیالوگ ، برمی گردند ( آنها دست را برای کد بعدی ، آزاد می گذارند ) . 


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



The ''Modal'' ones return only after closing the Dialog.


دیالوگهای مودال یا قانونی فقط بعد از بستن دیالوگ به سرجایشان برمی گردند 


( من شخصا از دیالوگهای قانونی که مانع از انجام هرکاری می شوند و آزادی را از کاربر سلب می کنند بیزارم . این نوع دیالوگها اکثرا توسط سایتهای مخرب یا هکرها طراحی و ساخته می شوند و بسیار خطرناک هستند .  هر زمان که به چنین دیالوگهایی برخورد کنم بدون پاسخ دادن به درخواستهایشان ، کلید اسکپ را فشار می دهم یا دیالوگ را می بندم تا از شرشان خلاص شوم.  فقط یک نوع از دیالوگهای قانونی را دوست دارم . همانهایی که برای ورود به وبلاگ یا سیستم عامل و وارد کردن نام کاربری و رمز ساخته شده اند !!  وحیدمی ) 



There is a serious problem with the different ways for closing these Dialogs. The WIn32 Documentation (the one I have) says that, for closing Modeless Dialog you should:


یک مشکل جدی و خطرناک با روشهای مختلف بستن این دیالوگها وجود دارد . مستندات ویندوز 32 بیتی ( آنهایی که من در اختیار دارم ) می گویند که ، برای بستن دیالوگهای آزاد شما باید دستور زیر را وارد نمایید :


call 'USER32.DestroyWindow' D$DialogHandle




And that you should close Modal Dialogs with:


و اینکه شما باید دیالوگهای قانونی را با این دستور ببندید :




call 'USER32.EndDialog' D$DialogHandle, 0




This is not exactly the way it works.

این عینا آن راهی که این سیستم کار می کند نیست . 


The fact is that, you will have to close Modal Dialogs from inside the Dialog Procedures, as long as they keep the execution flow for themselves.

حقیقت این است که ، شما مجبور خواهید شد که دیالوگهای قانونی را از درون روالهای دیالوگ ، ببندید  زیرا آنها  از مدتها قبل  ، جریان اجرا را برای خودشان نگه می دارند . 


( یعنی احتمالا از مدتها قبل ، در حافظه ی رم ، مقیم هستند و به این راحتی نمی توانید از شرشان خلاص شوید . وحیدمی ) 


 As opposed, for Modeless Dialogs, you will most often have to close them from outside the Dialog Proc, as long as other Code is running, at that time.


در آن طرف قضیه ، برای دیالوگهای آزاد ، شما اغلب اوقات مجبور خواهید شد که  آنها را از بیرون جریان دیالوگ ، از مدتها قبل که کد دیگری در حال اجرا می باشد در آن زمان  ، ببندید 




The problem is that applying the rule, as given in the documentation, will not work, under 95, if you have to close a Modal Dialog from inside its own Procedure, which is perfectly possible, if, from the outside, you send it a Message for  telling it to close.

مشکل اینست که اعمال کردن این قانون ، به همان شکلی که در مستندات آمده است ، تحت ویندوز 95 کار نخواهد کرد . اگر شما مجبور باشید که یک دیالوگ قانونی را از درون روال خودش ببندید که کاملا   امکان پذیر است ، اگر از بیرون ، شما یک پیام را به او مبنی بر بستن ارسال نمایید . 



 In such a case, under the 95 family, you have to close the Modeless Dialog the same way you close Modal ones (with 'EndDialog' instead of 'DestroyWindow').


در یک چنین موردی ، تحت ویندوزهای خانواده ی 95 ، شما مجبورید ببندید دیالوگهای آزاد را به همان روش که دیالوگهای قانونی را می بندید . 


( یعنی دیالوگهای آزاد را بجای تابع DestroyWindow ، مجبورید با تابع EndDialog  ببندید .  احتمالا این مشکل ، به ساختار کرنل ویندوزهای خانواده ی 95 مربوط می شود . این ویندوزهای قدیمی  از یک کرنل کاملا مونولیتیک و یکپارچه ( با الهام از کرنل سیستم عامل یونیکس یا داس ) استفاده می کردند لذا مرتبا هنگ می کردند . 

اگر بخاطر داشته باشید در ویندوز 98 به محض اینکه فلاپی دیسک را به درون درایو وارد می کردید و همان موقع بر روی ویندوز اکسپلورر یا مای کامپیوتر دابل کلیک می کردید تا بتوانید به درون درایو فلاپی وارد شوید ، ویندوز اکسپلورر بطور کامل هنگ می کرد و حتی صفحه ی آبی مرگ ظاهر می شد ! این اتفاق بارها و بارها برایم خودم رخ داد . شاید برای شما نیز اتفاق افتاده باشد . 

اما از ویندوز 2000 به اینطرف ، کرنل ویندوز از حالت مونولیتیک خارج شد و بصورت هیبریدی ( دورگه )  در آمد لذا دیگه شاهد هنگ کردن ویندوز در چنین مواردی نبودیم . در مورد دیالوگها نیز من یادم می آید که ویندوز 98 مرتبا در هنگام کار با دیالوگها  هنگ می کرد و واقعا اعصاب خردکن بود .  کرنل هیبریدی ویندوزهای خانواده  ویندوز ان تی ( از ویندوز 2000 تا ویندوز 11 و ویندوز سرور 2022 )  بدلیل هیبریدی و مادولار بودن عملا از هنگ کردن سیستم خودداری می نمایند و ما به ندرت شاهد هنگ کردن ویندوز در این نسخه ها هستیم . وحیدمی ) 


 This way works perfect on both OSes Families.


این روش بطور کامل روی هردو خانواده ی سیستم عامل ویندوز کار می کند:



Trying to reformulate all of this in more clear way, we can say that:


سعی کنید مجددا  همه این را در روش تمیزتر ( شفافتر )  تنظیم کنید . ما می توانیم مثلا بگوییم که :


You close all Dialogs by 'EndDialog', unless it is to be closed from ''outside'' the Dialog Procedure. 


شما تمام دیالوگها را با کمک تابع EndDialog ببندید ، مگر اینکه آن از " بیرون " روال دیالوگ بسته شده باشد . 


Notice that, here, 'outside' / 'inside' is to be considered in the process logical.

توجه کنید که ، اینجا  عبارتهای " درون / بیرون " ، در منطق جریان ( یا جریان منطقی ) ، مطرح شده اند . 



 I mean, if, from inside the Dialog Procedure of a Modeless Dialog, you call for a Routine that includes a closure Statement, this one is also to be considered ''inside'' the Dialog Procedure.


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



~~~~~~~

نقشه وبلاگ وحیدمی


https://vahidmy.blog.ir/sitemap.xml