PDA

View Full Version : اشکال در تبدیل API ویندوز از delphi به ++visual C



ali_mohamadi8928
جمعه 10 اسفند 1386, 14:34 عصر
سلام دوستان .... من یک مسئله ی واقعا عجیب برام پیش اومده .... من یکسری کد رو که مربوط به API ویندوز هستن و در کتابخانه ی Windows.H قرار گرفتن رو از Delphi به VC++ تبدیل کردم .... جالب اینجاست که این کدها در Delphi به خوبی اجرا شده و جواب میدن ولی توی VC++ اجرا میشن ولی جواب نمیدن .... این کدها مربوط به پاک کردن یک Value از ریجستری ویندوز هستن ... من هم کد Delphi رو میزارم که اجرا میشه و جواب میده هم کد VC++ رو میزارم که اجرا میشه ولی جواب نمیده ( واقعا برام عجیبه ).

کد Delphi


var
key1,key2:HKEY;
begin

RegOpenKeyEx(HKEY_CURRENT_USER,'SOFTWARE\Microsoft \Windows\CurrentVersion',0,KEY_ALL_ACCESS,key1);

RegOpenKeyEx(key1,'Run',0,KEY_ALL_ACCESS,key2);

RegDeleteValue(key2,'GoldenSoft');

RegCloseKey(key2);

RegCloseKey(key1);

end;

کد VC++


HKEY key1,key2;

key1 = 0;
key2 = 0;


RegOpenKeyEx(HKEY_CURRENT_USER,"SOFTWARE\Microsoft\Windows\CurrentVersion",NULL,KEY_ALL_ACCESS, &key1);

RegOpenKeyEx(key1,"Run",NULL,KEY_ALL_ACCESS, &key2);

RegDeleteValue(key2,"GoldenSoft");

RegCloseKey(key2);

RegCloseKey(key1);

به نظرتون کد VC++ چه اشکالی داره که اجرا میشه ولی کار نمیکنه ؟؟

Nima_NF
جمعه 10 اسفند 1386, 15:28 عصر
در C++ وقتی مسیری را به صورت رشته مشخص می کنید باید دو تا \ قرار دهید:



RegOpenKeyEx(HKEY_CURRENT_USER,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion",NULL,KEY_ALL_ACCESS, &key1);

پس از اجرای هر تابع آن را تست کنید که آیا ERROR_SUCCESS بر می گرداند یا خیر تا متوجه شوید در کدام خط اشتباه نوشته اید.

ضمنا لطفا عنوان مناسب انتخاب کنید و سوالات مرتبط با ++VC را در بخش خودش بپرسید.
لذا بعد از اینکه پست را مشاهده کردید ، آن را انتقال خواهم داد


موفق باشید

ali_mohamadi8928
جمعه 10 اسفند 1386, 15:56 عصر
خیلی ممنونم دوست عزیز .... چه جوری باید ERROR_SUCCESS رو انجام بدم ؟؟؟ میشه یه توضیح کوچیک بدین ؟؟؟

راستی ببخشید که پست رو اینجا زدم ... اخه قسمت مربوطه رو نتونستم پیدا کنم ... اگه پست رو منتقل کردین لطفا ادرسش رو برام پی ام کنید ...

با تشکر فراوان ...

Nima_NF
جمعه 10 اسفند 1386, 17:36 عصر
به سادگی برای هر کدام از توابع رجیستری:



if ( ERROR_SUCCESS != RegOpenKeyEx(...) )
{
// show Error
}


راه دیگر با جزییات هم می تواند به این صورت باشد (که البته راه فوق کافیست):
هر گاه مقدار برگشتی تابع غیر صفر بود ، با استفاده از تابع FormatMessage و تنظیم فلگ FORMAT_MESSAGE_FROM_SYSTEM نوع خطا را دقیق تر می توانید بدست آورید.