Проблема с обменом с 1С через COMConnector из MS Visual C++
#39413521
Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
|
|
|
Всем привет.
Пытаюсь из программы на MS Visual C++ подключится к базе 1С через COMConnector и получить версию конфигурации.
Ниже приведен код. Почему то после удачного соединения в базой,
не получается получить IDispatch на "Метаданные", чтобы потом получить свойство "Версия". Вызываю Invoke для dispID "Метаданные" с флагом DISPATCH_PROPERTYGET. Invoke возвращает ошибку 0x80020008 которая означает "Один из аргументов метода не является допустимым типом variant". В чем может быть проблема? Где я ошибся?
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147.
// ProgramTest.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <objbase.h>
#include <comdef.h>
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
int i;
HRESULT hr = CoInitialize(NULL);
if(FAILED(hr))
{
return 0;
}
CLSID cls80;
hr = CLSIDFromProgID(L"V82.COMConnector", &cls80);
if(FAILED(hr))
{
CoUninitialize();
return 0;
}
IDispatch *pv80;
hr = CoCreateInstance(cls80, NULL, CLSCTX_INPROC_SERVER, IID_IDispatch, (void**)&pv80);
if(FAILED(hr)||!pv80)
{
CoUninitialize();
return 0;
}
VARIANT vRet;
DISPPARAMS args = {0, 0, 0, 0};
VARIANT vars[3];
args.cArgs = 1;
args.rgvarg = vars;
ZeroMemory(vars, sizeof(vars));
std::locale::global(std::locale(""));
vars[0].vt = VT_BSTR;
vars[0].bstrVal = OLESTR("File=\"D:\\Разработка\\По работе\\Конвертация\";");
DISPID dispID;
BSTR MethodName=L"Connect";
hr = pv80->GetIDsOfNames(IID_NULL, &MethodName, 1, 0, &dispID);
if (FAILED(hr))
{
if (pv80) pv80->Release();
CoUninitialize();
return 0;
}
EXCEPINFO exs;
//соединимся с информационной базой
hr = pv80->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD,&args, &vRet, &exs, NULL);
if (FAILED(hr))
{
if (pv80) pv80->Release();
CoUninitialize();
return 0;
}
if(vRet.vt!=VT_DISPATCH)
{
if (pv80) pv80->Release();
CoUninitialize();
return 0;
}
/////ВСЕ ОК, СОЕДИНИЛИСЬ/////
std::cout<<"Соединилсь с базой успешно"<<std::endl;
IDispatch *connector=vRet.pdispVal;
//хотим получить версию конфигурации
//в 1С это далется так: Метаданные.Версия
//если попробовать из однй базы 1С подключится через COMConnector к другой базе 1С вот таким кодом:
////V8 = Новый COMObject ("V82.COMConnector");
////
////Соединение = V8.Connect ("File=""D:\Разработка\По работе\Конвертация"";");
////Сообщить(Соединение.Метаданные.Версия);
//то все получается.
//теперь попробуем здесь сделать также
VARIANT vRetMeta;
DISPPARAMS argsMeta = {0, 0, 0, 0}; //параметров никаких нет, это же получение свойства
MethodName=L"Метаданные";
hr = connector->GetIDsOfNames(IID_NULL,&MethodName, 1, 0, &dispID);
if (FAILED(hr))
{
if (connector) connector->Release();
if (pv80) pv80->Release();
CoUninitialize();
return 0;
}
//получить IDispatch на метаданные
hr = connector->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET,&argsMeta, &vRetMeta, &exs, NULL);
if (FAILED(hr))
{
//попадаем сюда, с ошибкой
if (hr==DISP_E_BADVARTYPE)
{
std::cout<<"Что-то не так с DISPPARAMS"<<std::endl;
}
else {
char ch[20];
itoa(hr,ch,16);
std::cout<<"Ошибка с кодом"<<ch<<std::endl;
}
std::cin>>i;
if (connector) connector->Release();
if (pv80) pv80->Release();
CoUninitialize();
return 0;
}
if(vRetMeta.vt!=VT_DISPATCH)
{
if (connector) connector->Release();
if (pv80) pv80->Release();
CoUninitialize();
return 0;
}
std::cout<<"отлично, есть IDispatch на метаданные, можно дальше получать версию"<<std::endl;
std::cin>>i;
return 0;
}
|
|