سؤال

لسنوات لقد تم استخدام ShellExecute() API إطلاق متصفح الويب الافتراضي من داخل التطبيقات.مثل هذا:

ShellExecute( hwnd, _T("open"), 
    _T("http://www.winability.com/home/"), 
    NULL, NULL, SW_NORMAL );

انها كانت تعمل بشكل جيد حتى قبل بضعة أسابيع ، عندما أصدرت جوجل كروم المتصفح.الآن, إذا كروم مثبت على الكمبيوتر ، ShellExecute API لم يعد يفتح صفحة ويب.

هل فكر أحد حتى الآن كيفية حل هذه المشكلة ؟ (باختصار من كشف كروم تظهر رسالة تخبر المستخدم أنه كروم خطأ؟)

تحرير:التعليمات البرمجية التي يوفرها سيرغي يبدو للعمل ، حتى لقد قبلت على أنها "إن" الإجابة.إلا أنني لا أحب الدعوة إلى WinExec:MSDN يقرأ هذا WinExec هو المقدمة فقط من أجل التوافق مع تطبيقات 16 بت.IOW ، قد تتوقف عن العمل مع أي حزمة خدمة.أنا لم أحاول ذلك, ولكن أنا لن يفاجأ إذا كان قد توقف عن العمل مع ويندوز x64, لأنه لا يدعم تطبيقات 16 بت في كل شيء.لذا بدلا من WinExec, انا ذاهب الى استخدام ShellExecute مع المسار المتخذ من التسجيل مثل سيرغي رمز لا URL الحجة.وذلك بفضل!

هل كانت مفيدة؟

المحلول

هنا هو رمز يعمل في جميع المتصفحات.الحيلة هي دعوة WinExec إذا ShellExecute فشل.

HINSTANCE GotoURL(LPCTSTR url, int showcmd)
{
    TCHAR key[MAX_PATH + MAX_PATH];

    // First try ShellExecute()
    HINSTANCE result = 0;

    CString strURL = url;

    if ( strURL.Find(".htm") <0 && strURL.Find("http") <0 )
        result = ShellExecute(NULL, _T("open"), url, NULL, NULL, showcmd);

    // If it failed, get the .htm regkey and lookup the program
    if ((UINT)result <= HINSTANCE_ERROR) {

        if (GetRegKey(HKEY_CLASSES_ROOT, _T(".htm"), key) == ERROR_SUCCESS) {
            lstrcat(key, _T("\\shell\\open\\command"));

            if (GetRegKey(HKEY_CLASSES_ROOT,key,key) == ERROR_SUCCESS) {
                TCHAR *pos;
                pos = _tcsstr(key, _T("\"%1\""));
                if (pos == NULL) {                     // No quotes found
                    pos = strstr(key, _T("%1"));       // Check for %1, without quotes
                    if (pos == NULL)                   // No parameter at all...
                        pos = key+lstrlen(key)-1;
                    else
                        *pos = '\0';                   // Remove the parameter
                }
                else
                    *pos = '\0';                       // Remove the parameter

                lstrcat(pos, _T(" \""));
                lstrcat(pos, url);
                lstrcat(pos, _T("\""));
                result = (HINSTANCE) WinExec(key,showcmd);
            }
        }
    }

    return result;
}

نصائح أخرى

بعد الاستماع إلى تقارير ShellExecute حكرا على أقلية من نظم تنفيذ دالة على غرار المثال المعطى من قبل سيرغي كورنيلوف.كان هذا قبل حوالي سنة.نفس المنطلق هل المباشر HKCR بحث .الملف HTM معالج.

ومع ذلك ، اتضح أن بعض المستخدمين قد المحررين (مثلا ، برنامج ultraedit) أن يسجلوا أنفسهم 'فتح' .htm الملفات (بدلا من 'تحرير' لهم).وهكذا ، إذا ShellExecute فشل هذه الثانوية الطريقة سوف تفشل أيضا في تلك الحالات.يفتح محرر ، كما قذيفة جمعية ضالا ويرشد.

وبالتالي ، يجب على المستخدم استخدام معالج HTTP بدلا من ذلك, أو على الأقل في تفضيل HTML معالج.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top