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

نام تاپیک: مشکل با تابع ShellExecute در visual C++‎ 2008

  1. #1

    Question مشکل با تابع ShellExecute در visual C++‎ 2008

    لطفآ توضیح بدید که چطور میشه از این تابع در یک برنامه کنسولی C++‎ استفاده کرد ؟

    البته بهتره این نکته رو متذکر بشم که من تازه برنامه نویسی win32 رو شروع کردم و این اولین تابعی هست که دارم باهاش کار می کنم! (پس خواهشآ در حد سوادم توضیح بدید!!!)

    خوب من نحوه استفاده از این تابع رو در MSDN خوندم ولی با این که همه نکات رو رعایت می کنم باز هم در کامپایل کد مشکل دارم ، به عنوان مثال به کد زیر توجه کنید:

    #include <shellapi.h>

    void main()
    {
    ShellExecute(NULL, "open","C:\\Programme\\VideoLAN\\VLC\\vlc.exe" , NULL, NULL, SW_SHOWNORMAL);
    }


    این ساده ترین مثالی بود که میشه نوشت ولی با این حال با هیچ کامپایلری نتونستم کامپایلش کنم و به این نتیجه رسیدم که حتمآ اشکال در کد نوشته شده است.

    خوب من باید چیکار کنم تا بتونم از این تابع و همچنین توابع دیگر در visual C++‎ 2008 استفاده کنم ، ایا پارامتری رو از جا انداختم ؟ ایا این تابع قبل از استفاده احتیاج به پیش نمونه یا تعریف متغیر و ... داره ؟ و ....

    از توضیحاتتون پیشاپیش متشکرم

  2. #2

    نقل قول: مشکل با تابع ShellExecute در visual C++‎ 2008

    نقل قول نوشته شده توسط pckho0r مشاهده تاپیک
    لطفآ توضیح بدید که چطور میشه از این تابع در یک برنامه کنسولی C++‎ استفاده کرد ؟

    البته بهتره این نکته رو متذکر بشم که من تازه برنامه نویسی win32 رو شروع کردم و این اولین تابعی هست که دارم باهاش کار می کنم! (پس خواهشآ در حد سوادم توضیح بدید!!!)

    خوب من نحوه استفاده از این تابع رو در MSDN خوندم ولی با این که همه نکات رو رعایت می کنم باز هم در کامپایل کد مشکل دارم ، به عنوان مثال به کد زیر توجه کنید:

    #include <shellapi.h>

    void main()
    {
    ShellExecute(NULL, "open","C:\\Programme\\VideoLAN\\VLC\\vlc.exe" , NULL, NULL, SW_SHOWNORMAL);
    }
    این ساده ترین مثالی بود که میشه نوشت ولی با این حال با هیچ کامپایلری نتونستم کامپایلش کنم و به این نتیجه رسیدم که حتمآ اشکال در کد نوشته شده است.

    خوب من باید چیکار کنم تا بتونم از این تابع و همچنین توابع دیگر در visual C++‎ 2008 استفاده کنم ، ایا پارامتری رو از جا انداختم ؟ ایا این تابع قبل از استفاده احتیاج به پیش نمونه یا تعریف متغیر و ... داره ؟ و ....

    از توضیحاتتون پیشاپیش متشکرم

    سلام.
    جای اینکه shellapi.h رو Include کنید، windows.h رو include کنید!

  3. #3

    نقل قول: مشکل با تابع ShellExecute در visual C++‎ 2008

    سلام.
    جای اینکه shellapi.h رو Include کنید، windows.h رو include کنید!
    با انجام این کار مشکلم حل شد.
    البته یک نکته دیگه هم وجود داشت که اون هم مربوط به رشته های یونیکد میشد، ظاهرآ به صورت پیش فرض تمامی رشته ها در visual C++‎ 2008 به صورت یونیکد بایستی تعریف بشن که با اضافه کردن یک L قبل از هر رشته مشکلم حل شد.

    شکل صحیح دستوری که بالاخره کامپایل شد بدین صورت هست :

    #include <windows.h>

    void main()
    {
    ShellExecute(NULL, L"open", L"C:\\Programme\\VideoLAN\\VLC\\vlc.exe", NULL, NULL, SW_SHOWNORMAL);
    }


    اما هنوز چند سوال باقی مونده که ممنون میشم جواب اینها رو هم بدید:

    1_ این تابع در سرفایل shellapi.h تعریف شده پس چرا بایستی برای استفاده از اون یک سرفایل دیگه رو ضمیمه کنیم؟

    2_پارامتر Operation تنها دستورات "open" ، "edit" ، "print" ، "explore" رو قبول میکنه در حالی که در MSDN نوشته که دستورات بسیار زیاد و متنوعی برای این تابع در دسترس است ، به عنوان مثال کد زیر به درستی کامپایل میشه ولی بعد از اجرا هیچگونه پاسخی از برنامه دریافت نمیشه !

    #include <windows.h>

    void main()
    {
    ShellExecute(NULL, L"Compress and email...", L"C:\\Programme\\VideoLAN\\VLC\\vlc.exe", NULL, NULL, SW_SHOWNORMAL);
    }


    البته برنامه winrar رو هم نصب کردم و گزینه مربوط هم در کلیک راست موس موجود است.

    3_ برای دریافت مقادیر بازگشتی تابع (جهت کنترل خطا) باید از چه نوعی استفاده کنم ؟ در MSDN نوع های بازگشتی به صورت رشته نوشته شده اند اما ایا این رشته ها به ترتیب دارای مقادیر عددی از صفر هستند ؟

    با نوع unsigned int تست کردم اما کامپایلر خطای زمان کامپایل می گیرد.

  4. #4

    نقل قول: مشکل با تابع ShellExecute در visual C++‎ 2008

    نقل قول نوشته شده توسط pckho0r مشاهده تاپیک
    با انجام این کار مشکلم حل شد. البته یک نکته دیگه هم وجود داشت که اون هم مربوط به رشته های یونیکد میشد، ظاهرآ به صورت پیش فرض تمامی رشته ها در visual C++‎ 2008 به صورت یونیکد بایستی تعریف بشن که با اضافه کردن یک L قبل از هر رشته مشکلم حل شد.
    سلام.
    بجای استفاده از L بهتره از _T استفاده کنید تا برنامه به CharSet خاصی Bind نشده باشه. به این ترتیب، در صورت نیاز، میتونید برنامه رو در حالت ASCII هم (بدون دخل و تصرفی توش) Compile کنید.

    اما هنوز چند سوال باقی مونده که ممنون میشم جواب اینها رو هم بدید:
    1_ این تابع در سرفایل shellapi.h تعریف شده پس چرا بایستی برای استفاده از اون یک سرفایل دیگه رو ضمیمه کنیم؟
    برای اینکه شما به Definition های دیگه ای هم نیاز دارید. بعنوان مثال، SW_SHOWNORMAL. و بهمین ترتیب برید جلو... اگر فایل Windows.h رو باز کنید، خود Shellapi.h هم توی Windows.h قرار داره.

    2_پارامتر Operation تنها دستورات "open" ، "edit" ، "print" ، "explore" رو قبول میکنه در حالی که در MSDN نوشته که دستورات بسیار زیاد و متنوعی برای این تابع در دسترس است ، به عنوان مثال کد زیر به درستی کامپایل میشه ولی بعد از اجرا هیچگونه پاسخی از برنامه دریافت نمیشه !
    MSDN رو ببینید:

    In systems prior to Microsoft Windows 2000, the default verb is used if it is valid and available in the registry. If not, the "open" verb is used.
    In Windows 2000 and later, the default verb is used if available. If not, the "open" verb is used. If neither verb is available, the system uses the first verb listed in the registry.


    همونطوریکه می بینید، گفته اگر verb وجود داشته باشه تو Registry ازش استفاده خواهد شد. در غیر اینصورت خیر.

    void main()
    {
    ShellExecute(NULL, L"Compress and email...", L"C:\\Programme\\VideoLAN\\VLC\\vlc.exe", NULL, NULL, SW_SHOWNORMAL);
    }[/php]

    البته برنامه winrar رو هم نصب کردم و گزینه مربوط هم در کلیک راست موس موجود است.
    احتمالا بخاطر آوردن اون سه نقطه در verb هستش که کار نمیکنه. باید Registry رو نگاه کنید.

    3_ برای دریافت مقادیر بازگشتی تابع (جهت کنترل خطا) باید از چه نوعی استفاده کنم ؟
    HINSTANCE

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

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