RXL
|
|
« Ответ #60 : 07-04-2010 07:56 » |
|
Пробовал и такие варианты...
Работает. Объект создается. Если я укажу в методе Logon иное число параметров, он ругается, что их число слишком велико или что пропущен важный параметр - значит с этим все путем.
Объект в VB6 и в ASP создается без проблем.
|
|
« Последнее редактирование: 07-04-2010 07:58 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Sla
|
|
« Ответ #61 : 07-04-2010 08:32 » |
|
а пробовал параметры слева-направо передать?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #62 : 07-04-2010 08:35 » |
|
Я вот об этом же подумал. Раз они наоборот передаются, этож не значит, что они принимаются наоборот. Значит надо передавать по-другому
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #63 : 07-04-2010 09:07 » |
|
В обратном порядке не может быть. Конечно, попытка не пытка, но результат был очевидный Вот трассировка исключения, если убрать все "new VARIANT": array(1) { [0]=> array(6) { ["file"]=> string(31) "D:\Work\src\www\tests\com_1.php" ["line"]=> int(43) ["function"]=> string(5) "Logon" ["class"]=> string(3) "com" ["type"]=> string(2) "->" ["args"]=> array(5) { [0]=> string(5) "login" [1]=> string(4) "pass" [2]=> &string(3) "dns" [3]=> &string(0) "" [4]=> &int(0) } } }
По аргументам видно, что первые два передаются по значению, а последние три - по ссылке. Т.е. так, как требует документация.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
RXL
|
|
« Ответ #64 : 08-04-2010 06:12 » |
|
Все еще бьюсь над разгадкой. Есть такая функция - com_print_typeinfo($com_object). Она распечатывает класс, автоматически создаваемый PHP для COM-объекта. Вот описание метода Logon() оттуда: /* DISPID=1610809554 */ /* VT_BOOL [11] */ function Logon( /* VT_BSTR [8] [in] */ $LogonID, /* VT_BSTR [8] [in] */ $Password, /* VT_PTR [26] [in][out] --> VT_BSTR [8] */ &$DataSourceName, /* VT_PTR [26] [in][out] --> VT_BSTR [8] */ &$Result, /* VT_PTR [26] [in][out] --> VT_I2 [2] */ &$Severity ) { }
Даже не знаю... Может оно мне чем-то помочь? Мозг уже не видит, какие варианты еще можно попробовать.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
sss
Специалист
Offline
|
|
« Ответ #65 : 08-04-2010 06:35 » |
|
RXL, а откуда берется VT_I2 ? В MSDN про Integer Data Type (Visual Basic) пишут "Holds signed 32-bit (4-byte) integers ranging in value from -2,147,483,648 through 2,147,483,647"...
|
|
|
Записан
|
while (8==8)
|
|
|
RXL
|
|
« Ответ #66 : 08-04-2010 07:08 » |
|
sss, в VB6 (не VB.NET!) тип Integer соответствует short int, а Long - int.
Использовать VT_I4 я уже пробовал.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
sss
Специалист
Offline
|
|
« Ответ #67 : 08-04-2010 07:29 » |
|
RXL, ну не знаю. Попробуй установить все в NULL... var.vt = VT_ERROR; var.scode = DISP_E_PARAMNOTFOUND;
|
|
|
Записан
|
while (8==8)
|
|
|
RXL
|
|
« Ответ #68 : 08-04-2010 13:18 » |
|
Тогда смысла не будет. Кстати, scode у меня нет - только значение и тип. Вот порылся в доках: Overloaded Methods The returned object is an overloaded object, which means that PHP does not see any fixed methods as it does with regular classes; instead, any property or method accesses are passed through to COM.
Starting with PHP 5, PHP will automatically detect methods that accept parameters by reference, and will automatically convert regular PHP variables to a form that can be passed by reference. This means that you can call the method very naturally; you needn't go to any extra effort in your code.
In PHP 4, to pass parameters by reference you need to create an instance of the VARIANT class to wrap the byref parameters.
Честно говоря, не понимаю, как стыкуется заголовок и первый абзац к другим двум абзацам. Во втором абзаце говорится, что выпендриваться не нужно - просто подавай переменные и PHP сам все разрулит. В третьем - о том, как было в PHP 4. Я пробовал и так и сяк - не хочет. Больше всего сбивает с толку нумерация параметров - не могу точно локализовать источник проблем. Думаю о всех трех параметрах BYREF, но манипуляции с VARIANT мне не помогли.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
RXL
|
|
« Ответ #69 : 08-04-2010 16:07 » |
|
Решил я на это забить. Все равно, коли есть винда, то и ASP на ней работает, а из ASP проблем с COM нет. а аналогичный по смыслу с++ код работает? Т.е. вопрос в следующем - сам ком сервер работает?
Это сторонний софт, который работает этак лет 10 уже. Последние 4 года сервис написан на VB.NET (.NET 1.1), а до этого - на VB6. Интерфейсом к софту являются три COM-библиотеки. Из Borland C++ Builder 6 я успешно с ним общаюсь (классовая обертка автоматически сгенерена в Delphi 7). Также работаю с ним из VB6 и ASP (JavaScript). А вот в PHP5 работать отказывается. И дальше уйти не могу, т.к. сперва нужно залогиниться на сервере приложений, а это мне никак не удается из-за непонятной ошибки с параметрами.
|
|
« Последнее редактирование: 08-04-2010 16:15 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
RXL
|
|
« Ответ #70 : 29-03-2012 06:20 » |
|
Два года спустя вернулся к той же задаче. Перерыл инет и нашел все тоже самое: эту тему и один совет - все остальное просто мусор. Совет простой: написать свой COM на VB, где реализовать всю необходимую логику и простой интерфейс, совместимый с PHP. Первые тесты уже дали положительные результаты. Когда напишу что-то посерьезнее logon/logoff отпишусь здесь. А то тенденция: в инете полезная инфа пропадает, а здесь - скапливается.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #71 : 29-03-2012 07:12 » |
|
RXL, web-service на ASP.NET как надстройка над твоим COM, а с веб-сервисом PHP по SOAP+WSDL всяко договорится Конечно, если это не высоконагруженное приложение.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
RXL
|
|
« Ответ #72 : 29-03-2012 08:57 » |
|
Нет, не нагруженное. Для каждого запроса к сервису нужно создавать COM-объект, вызывать logon (на сервере DCOM-приложений создается новый процесс), затем там же создаются кучи других объектов. Несколько секунд на каждый запрос.
Я пока рассматриваю вариант VB6+PHP. Не хочу привязываться к IIS.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #73 : 29-03-2012 11:32 » |
|
RXL, тогда WCF.NET, у неё хост может быть любой: хоть IIS, хоть собственный exe, хоть служба WinNT. А функции те же, и HTTP поддерживает, и другие протоколы.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
RXL
|
|
« Ответ #74 : 29-03-2012 16:17 » |
|
Проверил: мои беды были из-за VB6 типа Integer, а при использовании Long программа без проблем работает. Также работает передача ByVal и ByRef. Тестил на WinXP SP3 с PHP 5.2.17 оригинальной сборки (VC6).
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|