фона:Ошибка использования терпимы 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));
Альтернативы:
- Жесткий код MSXML6 (вместо MSXML4). Нехорошее решение, так как мы не знаем, какая версия MSXML установлена на рабочей станции. Кроме того, код снова сломается, если Microsoft выпустит следующую версию DLL.
- Динамически загрузить последний из реестра: Find MSXML version from registry и Dynamically load a function from a DLL
- Используйте type library вместо?
- Я был бы рад услышать дополнительные альтернативы
Вопрос:
Что является самым простым и наиболее надежным способом изменить свой код, чтобы быть MSXML версии агностик? То есть, используйте IServerXMLHTTPRequest независимо от версии MSXML, фактически установленной на клиентской машине. Если версия MSXML не установлена, запросите пользователя и выйдите изящно.
Нужна дополнительная информация? Просто дайте мне знать
Спасибо!
Пункт msxml4 заключается в том, что вы можете установить его самостоятельно. Так что, если он отсутствует, вы сделали это неправильно :) –
Нет, MSXML4 больше не поддерживается: http://msdn.microsoft.com/en-us/data/bb291077.aspx. Я хотел бы использовать версию, существующую на машине. Спасибо за ваш комментарий. –
Создается экземпляр 'ServerXMLHTTP40', который является объектом версии 4. Если это не удается, вы можете попробовать другую версию: 'if (FAILED (hr)) {// hr = ... CoCreateInstance (... 60); } ' –