Ловля LoadLibrary () ошибки корректно

== тесты для ссылочного равенства (являются ли они тем же объектом).

.equals() тесты для равенства значения ("равны" ли они логически).

Objects.equals () проверки на null прежде, чем звонить .equals(), таким образом, Вы не имеете к (доступный с JDK7, также доступного в [1 113] Гуава ).

String.contentEquals () сравнивает содержание String с содержанием любого CharSequence (доступный начиная с Java 1.5).

, Следовательно, если Вы хотите протестировать, имеют ли две строки то же значение, которое Вы, вероятно, захотите использовать Objects.equals().

// These two have the same value
new String("test").equals("test") // --> true 

// ... but they are not the same object
new String("test") == "test" // --> false 

// ... neither are these
new String("test") == new String("test") // --> false 

// ... but these are because literals are interned by 
// the compiler and thus refer to the same object
"test" == "test" // --> true 

// ... string literals are concatenated by the compiler
// and the results are interned.
"test" == "te" + "st" // --> true

// ... but you should really just call Objects.equals()
Objects.equals("test", new String("test")) // --> true
Objects.equals(null, "test") // --> false
Objects.equals(null, null) // --> true

Вы почти [1 132] всегда хотят использовать Objects.equals(). В редкий ситуация, где Вы знаете , Вы имеете дело с [1 115], интернировал строки, Вы можете использование ==.

От [1 116] JLS 3.10.5. Строковые литералы :

, Кроме того, строковый литерал всегда относится к тот же экземпляр класса String. Это вызвано тем, что строковые литералы - или, в более общем плане, строки, которые являются значениями константных выражений ( В§15.28 ) - "интернируются", чтобы совместно использовать уникальные экземпляры, с помощью метода String.intern.

Подобные примеры могут также быть найдены в [1 118] JLS 3.10.5-1 .

6
задан rpg 19 August 2009 в 12:55
поделиться

6 ответов

Может помочь MapAndLoad из ImageHLP.DLL. Он возвращает структуру LOADED_IMAGE.

1
ответ дан 17 December 2019 в 02:31
поделиться

В какой-то момент я загружаю свою DLL через вызов LoadLibrary (). Это втягивает какая бы библиотека Qt ни была у пользователя система.

Не делайте этого! Типы ошибок, которые у вас есть, являются удачными, так же легко могут повредить память и привести к сбою. Канонический способ доставки приложения Qt - это либо доставка DLL, либо статическая компоновка. Ознакомьтесь с руководством по развертыванию Qt в файлах справки.

Позже отредактируйте:

Прочитав ваши комментарии, я все еще не рекомендую вам использовать этот подход, так как вы не можете быть уверены, что библиотеки DLL даже бинарно совместимы. если они загружаются, что может привести к трудностям отслеживания ошибок.

Тем не менее, я считаю, что вы можете перехватить вызовы LoadLibrary и посмотреть, какие из них не работают. Для этого можно использовать библиотеку MS Detours . Также см. этот вопрос о переполнении стека.

2
ответ дан 17 December 2019 в 02:31
поделиться

Если не считать подключения отладчика к вашему процессу, я не думаю, что вы сможете. Сообщение, которое обычно появляется, когда это происходит, генерируется внутри LoadLibrary. SetErrorMode используется во многих приложениях для запрета сообщений этой формы, я предполагаю, что где-то в структуре ваших приложений он вызывает SetErrorMode , чтобы запретить сообщение ОС.

Единственное приложение, которое я видел, генерирует собственные подробные сообщения о сбоях загрузки dll - это MS DevStudio, которая прикреплена как отладчик и поэтому имеет доступ к специальному потоку отладочных событий.

1
ответ дан 17 December 2019 в 02:31
поделиться

Can you be more proactive and check the version of the QT binaries you need before you call LoadLibrary()? Then you can just warn your user they don't have the version your app needs, and maybe even provide a link to the install point for them.

0
ответ дан 17 December 2019 в 02:31
поделиться

Чтобы расширить ответ jeffamaphone, вы можете попробовать получить сведения о версии файла перед вызовом LoadLibrary . Вы можете сделать это с помощью следующей функции:

BOOL GetFileDetails(LPCTSTR lpszPath, LPDWORD lpMajorVersion, 
                    LPDWORD lpMinorVersion)
{
    DWORD dwVersionHandle;

    DWORD dwVersionSize = GetFileVersionInfoSize((LPTSTR)lpszPath,
                                                 &dwVersionHandle);
    if (dwVersionSize == 0)
        return FALSE;

    LPBYTE lpVersion = new BYTE[dwVersionSize];

    if (!GetFileVersionInfo((LPTSTR)lpszPath, dwVersionHandle, 
                            dwVersionSize, lpVersion))
    {
        delete [] lpVersion;
        return FALSE;
    }

    VS_FIXEDFILEINFO *pVersionInfo = NULL;
    UINT nLength;

    if (!VerQueryValue(lpVersion, _T("\\"), (LPVOID *)&pVersionInfo, &nLength))
    {
        delete [] lpVersion;
        return FALSE;
    }

    *lpMajorVersion = pVersionInfo->dwFileVersionMS;
    *lpMinorVersion = pVersionInfo->dwFileVersionLS;

    return TRUE;
}

Затем вы можете сравнить основные / дополнительные номера версий с ожидаемыми.

2
ответ дан 17 December 2019 в 02:31
поделиться

У вас также могут быть окна проверьте это с помощью файла манифеста. Этот файл содержит информацию о требованиях к используемым версиям библиотек. Более точная и полная информация находится на сайте msdn .

Взгляните на ответ на этот вопрос о том, как использовать LoadLibrary с файлом манифеста .

Qt в документации кратко упоминается использование файла манифеста для VS2005; для более ранних версий вам придется создать его самостоятельно.

0
ответ дан 17 December 2019 в 02:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: