Итак имеем программу sapgui. При ее вызове с пустой коммандной строкой появляется ошибка ввиде диалога SAPGUI USAGE........... Если пустим ее например так: sapgui /H/192.168.1.1/S/3211 - все запустится нормально............... Данная программа предоставляет COM-компонент, который прорегистрирован в системе. Дальше все происходит в VS2008. Делаем CLR-проект, включаем этот компонент к сборке и пишем такой код: Код | GuiConnection ^qqq = nullptr; GuiApplication ^sss = nullptr;
sss = gcnew GuiApplication(); sss->OpenConnectionByConnectionString(L"/H/192.168.1.1/S/3211", false, false); int i = sss->Connections->Count; for(int j = 0; j < i; j++) { qqq = (GuiConnection ^)sss->Connections->ElementAt(j); if(qqq->DisabledByServer) { MessageBox::Show("qqq"); continue; } int k = qqq->Sessions->Count; for(int l = 0; l < k; l++) { GuiComponent ^zzz; GuiSession ^mmm = (GuiSession ^)qqq->Sessions->ElementAt(l); zzz = mmm->FindById("/app/con[0]/ses[0]/wnd[0]/usr/txtRSYST-MANDT", false); ((GuiTextField ^)zzz)->Text = "030"; zzz = mmm->FindById("/app/con[0]/ses[0]/wnd[0]/usr/txtRSYST-BNAME", false); ((GuiTextField ^)zzz)->Text = "logonname"; zzz = mmm->FindById("/app/con[0]/ses[0]/wnd[0]/usr/pwdRSYST-BCODE", false); ((GuiPasswordField ^)zzz)->Text = "userpass"; mmm->SendCommand("fb03"); } } |
Все работает на ура. Делаем Win32 проект и пишем такой код: Код | #include "stdafx.h" #include "wtypes.h" #include "atlbase.h"
int _tmain(int argc, _TCHAR* argv[]) { IDispatch *qqq = NULL; HRESULT hr; LPCOLESTR lpszProgID = OLESTR("Sapgui.ScriptingCtrl.1"); CLSID lpclsid; DISPID dispid; OLECHAR FAR* szMember0 = OLESTR("OpenConnectionByConnectionString"); EXCEPINFO pExcepInfo; unsigned int puArgErr = 0; DISPPARAMS dispparams; VARIANT dispRes; VARIANTARG var[3]; BSTR cmd0 = SysAllocString(L"/H/192.168.1.1/S/3211");
hr = ::CoInitializeEx(0, COINIT_MULTITHREADED); hr = CLSIDFromProgID(lpszProgID, &lpclsid); hr = ::CoCreateInstance(lpclsid, 0, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, IID_IDispatch, (LPVOID *)&qqq); hr = qqq->GetIDsOfNames(IID_NULL, &szMember0, 1, LOCALE_SYSTEM_DEFAULT, &dispid); var[0].vt = VT_BSTR; var[0].bstrVal = cmd0; var[1].vt = VT_BOOL; var[1].boolVal = 0; var[2].vt = VT_BOOL; var[2].boolVal = 0; dispparams.rgvarg = var; dispparams.cArgs=3; dispparams.rgdispidNamedArgs=NULL; dispparams.cNamedArgs=0; hr = qqq->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD | DISPATCH_PROPERTYGET , &dispparams, &dispRes, &pExcepInfo, &puArgErr); if(qqq) { qqq->Release(); qqq = NULL; } ::CoUninitialize(); return 0; } |
И вот тут Invoke возвращает код ошибки 0x80020009 при этом выскакивает тот самый диалог SAPGUI USAGE - о котором и говорилось вначале. Сам метод по данным OLE/COM Viewer имеет следующую декларацию: Код | [id(0x00008096)] GuiConnection* OpenConnectionByConnectionString( BSTR ConnectString, [optional] VARIANT Sync, [optional] VARIANT Raise);
|
Подскажите, плиз, куда теряется параметр коммандной строки...............
|