مشکل شمارش پروسس ها در حال اجرا توسط EnumProcesses

چند روز پیش  در حال استفاده از تابع EnumProcesses بودم که با خطای زمان اجرای جالبی رو به رو شدم. برنامه به درستی کامپایل میشد ولی در زمان اجرا اعلام می کرد که تابع K32EnumProcesses را در Kernel32.dll پیدا نکره است.

پیش تعریف تابع EnumProcesses در هیدر فایل psapi.h قرار دارد و برای استفاده از آن باید کتابخانه psapi.lib را در زمان لینک ضمیمه کرد. البته تا آخرین باری که از این تابع استفاده کرده بودم این طور بود.
پس از بررسی اسناد مایکروسافت متوجه نکته جالبی شدم. پیاده سازی این تابع در نسخه های مختلف ویندوز متفاوت است. به طور خلاصه:
1- پیش تعریف این تابع در psapi.h قرار دارد.
2- در زمان کامپایل:
بر روی ویندوز 7 و ویندوز سرور 2008 R2 اگر PSAPI_VERSION بزگتر از 1 باشد به کتابخانه kernel32.lib
بر روی ویندوز 7 و ویندوز سرور 2008 R2 اگر PSAPI_VERSION برابر با 1 باشد به کتابخانه psapi.lib
بر روی سایر نسخه های ویندوز به کتابخانه psapi.lib
نیاز خواهید داشت.
3- در زمان اجرا نیز به dll نظیر lib مورد نظر ( kernel32.dll یا psapi.dll ) نیاز دارید.

PSAPI_VERSION توسط یک پیش پردازشگر define در ابتدای فایل psapi.h تعریف شده است.
این پیش پردازشگر به کمک پیش پردازشگرهای شرطی و نسخه سیستم عامل شما مقدار PSAPI_VERSION را تعیین می کند.
اما در مورد مشکل من این مقدار به اشتباه 2 تعیین میشد ( بر روی ویندوز xp ) که مجبور شدم به صورت دستی مقدار 1 را برای آن اختصاص دهم.
به دلیل این اختصاص اشتباه، در زمان کامپایل نام این تابع K32EnumProcesses در نظر گرفته میشد و انتظار می رفت در kernel32.lib یافت شود ولی با تغییر نسخه، نام این تابع EnumProcesses در نظر گرفته می شد و در psapi.dll یافت میشد.


برای مطالعه بیشتر: