2014-11-10 3 views
1

фона:Ошибка использования терпимы DLL в Visual C++

У меня есть существующий код, который использует функциональные возможности, предоставляемые Microsoft, чтобы получить возможность отправлять данные XML через HTTP. В частности, IServerXMLHTTPRequest (включен в MSXML3 и выше) из msxml4.dll (COM).

Проблема:

В возможных неожиданностях, были msxml4.dll является отсутствует на клиентскую рабочей станции, описанная операция POST просто неудачу. More information about MSXML versions.

Текущий код:

#import "msxml4.dll" 
using namespace MSXML2; 
… 
IServerXMLHTTPRequestPtr spIXMLHTTPRequest = NULL; 
hr = spIXMLHTTPRequest.CreateInstance(__uuidof(ServerXMLHTTP40)); 

Альтернативы:

  1. Жесткий код MSXML6 (вместо MSXML4). Нехорошее решение, так как мы не знаем, какая версия MSXML установлена ​​на рабочей станции. Кроме того, код снова сломается, если Microsoft выпустит следующую версию DLL.
  2. Динамически загрузить последний из реестра: Find MSXML version from registry и Dynamically load a function from a DLL
  3. Используйте type library вместо?
  4. Я был бы рад услышать дополнительные альтернативы

Вопрос:

Что является самым простым и наиболее надежным способом изменить свой код, чтобы быть MSXML версии агностик? То есть, используйте IServerXMLHTTPRequest независимо от версии MSXML, фактически установленной на клиентской машине. Если версия MSXML не установлена, запросите пользователя и выйдите изящно.

Нужна дополнительная информация? Просто дайте мне знать

Спасибо!

+0

Пункт msxml4 заключается в том, что вы можете установить его самостоятельно. Так что, если он отсутствует, вы сделали это неправильно :) –

+0

Нет, MSXML4 больше не поддерживается: http://msdn.microsoft.com/en-us/data/bb291077.aspx. Я хотел бы использовать версию, существующую на машине. Спасибо за ваш комментарий. –

+0

Создается экземпляр 'ServerXMLHTTP40', который является объектом версии 4. Если это не удается, вы можете попробовать другую версию: 'if (FAILED (hr)) {// hr = ... CoCreateInstance (... 60); } ' –

ответ

1

От MSDN:

MSXML версии 3.0 была последняя версия MSXML для поддержки версий независимые GUIDs и идентификаторы ProgID. Начиная с версии 4.0, MSXML устанавливается на вашем компьютере в бок о бок режиме. Это означает, что, например, установка MSXML 5.0 для приложений Microsoft Office не заменяет ранее установленной версии анализатора MSXML на вашем компьютере. Это делается для защиты качества приложений, которые в настоящее время используют более ранние версии MSXML. Режим Side-by-Side также позволяет вам решить, какую версию парсера использовать в вашем коде.

Это означает, что нет COM класс установлен, который вы можете создать экземпляр, ожидая, что самая последняя установленная версия будет подобран, или иначе кто-то другой будет решать за вас, загружать ли MSXML 4 или 6 в зависимости от наличия или другой критерии.

Ожидается, что вы будете использовать определенную версию и быть в зависимости от того, какая среда исполнения будет доступна или установлена. Или вы можете переключаться между версиями MSXML в свой код as you already discovered.