Переключение на Главную Страницу Страницы: 1 [2]  ОтправитьПечать
Горячая тема (более 10 ответов) Вызов функций длл из 1С (число прочтений - 17566 )
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Вызов функций длл из 1С
Ответ #15 - 02. Октября 2009 :: 06:57
Печать  
Если использовать то, что закомментировано - 1С работает. Но после генерации одного договора через OpenOffice - вылетает. Там есть такое:
Цитата:
     scr = СоздатьОбъект("MSScriptControl.ScriptControl");
     scr.language = "javascript"; // встроенный язык 1С не поддерживает массивы нужные для OpenOffice API, поэтому будем использовать Javascript

     scr.ExecuteStatement("
                 |try { oServiceManager = new ActiveXObject('com.sun.star.ServiceManager'); }
                 |catch (err) { alert('Couldn\'t open OpenOffice!'); }
                 |oStarDesktop = oServiceManager.createInstance('com.sun.star.frame.Desktop');
                 |oDoc = oStarDesktop.LoadComponentFromURL('" + УРЛ_Шаблона + "', '_blank', 0, Array());
                 |Labels = new Object();
                 |function AddLabel(Name, Value) { Labels[Name] = Value; }");

     scr.ExecuteStatement("
           |oEnum = oDoc.getTextFields().createEnumeration(); // Enumerate text fields
           |while (oEnum.hasMoreElements()) {
           |      Field = oEnum.nextElement();
           |      FieldName = Field.TextFieldMaster.Name;
           |      if (FieldName.substr(0, 2) == '__') continue;  //поля с префиксом '__' не трогаем - служебные
           |      NewValue = Labels[FieldName.toLowerCase()];
           |      if (NewValue == undefined) NewValue = '########';
           |      if (Field.SupportsService('com.sun.star.text.TextField.SetExpression'))
           |            Field.Content = NewValue;
           |      else if (Field.SupportsService('com.sun.star.text.TextField.User'))
           |            Field.Anchor.String = NewValue;
           |}
           |oDoc.getTextFields().refresh()");


Если же меняю (думал - может мало памяти для хранения указателя выделяется)
Цитата:
          ppBuffer = DX.StrPtr ( DX.Space ( 256) ); // Pointer to a variable that receives a pointer to the requested information. The format and contents of the data depend on the information class specified in the WTSInfoClass parameter. To free the returned buffer, call the WTSFreeMemory function.
          pBytesReturned = DX.StrPtr ( DX.Space ( 256 ) ); // Pointer to a variable that receives the size, in bytes, of the data returned in ppBuffer.

тогда 1С  вылетает при запуске (когда запускается конструктор)

Не знаю, в чем дело. Помогите Злой
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Вызов функций длл из 1С
Ответ #16 - 03. Октября 2009 :: 11:07
Печать  
я подумал убить двух зайцев сразу. поскольку dynamicwrapperx подключается как внешняя компонента - создам свою внешнюю компоненту, к-я отменит нужду в dynamicwrapperx и будет вытаскивать необходимые данные через WTSQuerySessionInformationA.
так что пока вопрос закрыт
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Вызов функций длл из 1С
Ответ #17 - 03. Октября 2009 :: 16:28
Печать  
И, по ходу дела, еще один вопрос:

   
Код
Выбрать все
Функция ПолучитьСостояниеСессии () // текущей сессии терминального сервера
         lRet = Запросить ( 8 ); // WTSConnectState
         Если lRet <> 0 Тогда
               Session_Connection_State = DX.NumGet ( pBuffer, 0, "l" ); // Pointer to an INT variable that contains a value from the WTS_CONNECTSTATE_CLASS enumeration type to indicate the session's current connection state.
               DX.WTSFreeMemory ( ppBuffer );
         Иначе
               Session_Connection_State = -1;
         КонецЕсли;
         Возврат Session_Connection_State;
КонецФункции 



Во всех примерах, что я нашел в интернете, так и делается: DX.WTSFreeMemory ( ppBuffer )
Но мне кажется, что должно быть: DX.WTSFreeMemory ( pBuffer )
Документация MSDN (http://msdn.microsoft.com/en-us/library/aa383834%28VS.85%29.aspx ) говорит:
  Цитата:
void WTSFreeMemory(
     __in  PVOID pMemory
   );

   pMemory [in]

       Pointer to the memory to free.

Но ppBuffer - указатель на область памяти, в которую функция WTSQuerySessionInformationA возвращает указатель на выделенную функцией память (т.е. указатель на указатель), в к-й находится результат запроса (http://msdn.microsoft.com/en-us/library/aa383838%28VS.85%29.aspx ):

  Цитата:
ppBuffer [out]
       A pointer to a variable that receives a pointer to the requested information. The format and contents of the data depend on the information class specified in the WTSInfoClass parameter. To free the returned buffer, call the WTSFreeMemory function.

Все вроде бы работает, но почему так?
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
WTSAPI32.H и WTSAPI32.lib
Ответ #18 - 06. Октября 2009 :: 09:46
Печать  
Народ, у кого есть эти два файла из Visual Studio 6.0 with Platform SDK: WTSAPI32.H и WTSAPI32.lib?
Сделайте доброе дело - вышлите на мыло drmario -at- inbox.ru.

Metaeditor согласился помочь в вопросе с компонентой, к-я будет добывать сведения от wtsapi32.dll
  
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: WTSAPI32.H и WTSAPI32.lib
Ответ #19 - 06. Октября 2009 :: 10:31
Печать  
blindvic писал(а) 06. Октября 2009 :: 09:46:
Народ, у кого есть эти два файла из Visual Studio 6.0 with Platform SDK: WTSAPI32.H и WTSAPI32.lib?
Сделайте доброе дело - вышлите на мыло drmario -at- inbox.ru.

Metaeditor согласился помочь в вопросе с компонентой, к-я будет добывать сведения от wtsapi32.dll

Microsoft Platform SDK for Windows Server 2003 R2
  

WtsApi32.zip ( 5 KB | Загрузки )
Наверх
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Вызов функций длл из 1С
Ответ #20 - 06. Октября 2009 :: 11:15
Печать  
trdm и berezdetsky - спасибо
  
Наверх
 
IP записан
 
Infopol
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 1
Зарегистрирован: 07. Марта 2024
Re: Вызов функций длл из 1С
Ответ #21 - 07. Марта 2024 :: 07:20
Печать  
Работаю не в 1С,но сделал comDll которая работает практически со всеми языками через объект и имеется функция определения IP адреса клиента WTS
RDS=["b_main"].RemoteConnectTest(IPAdr,Computer)      

    ФУНКЦИЯ ЛОГИКА:RemoteConnectTest(ПЕРЕМ СТРОКА:IPAdr,Computer)
    //["b_main"].RemoteConnectTest(IPAdr)
  РЕЗУЛЬТАТ=НЕТ

       Computer="" IPAdr=""
     ЕСЛИ ЕСТЬ_ОБЪЕКТ("Ip2Com_events.Ip2Com")ТО   // ОТЛАДКА(1)
                                о=СОЗДАТЬ_ОБЪЕКТ!("Ip2Com_events.Ip2Com")
                                ПОПЫТКА
                                     РЕЗУЛЬТАТ= о.F_GetTerminalSession(IPAdr,Computer)//,IPAdr,ComputerName
      Computer=УБР_ПРОБ(Computer)
     // ОТЛАДКА(IPAdr)
      ЕСЛИ СЛОВО(4,IPAdr,".")="0" И ЗАГЛ(КОМПЬЮТЕР)<>ЗАГЛ(Computer) И ЗАГЛ(Computer)<>"" ТО
       // ОТЛАДКА(2)
IPAdr=( ["b_main"].GetIPFromHost(Computer) )
РЕЗУЛЬТАТ=ДА
КОНЕЦ_ЕСЛИ
  КОНЕЦ_ЕСЛИ

КОНЕЦ_ФУНКЦИИ

ФУНКЦИЯ СТРОКА:GetIPFromHost(СТРОКА:HostName)
  РЕЗУЛЬТАТ="0.0.0.0"
  ЕСЛИ ЕСТЬ_ОБЪЕКТ("Ip2Com_events.Ip2Com")ТО
     о=СОЗДАТЬ_ОБЪЕКТ!("Ip2Com_events.Ip2Com")
     IPAdr="" WSAErr=""
     ЕСЛИ о.F_GetIPFromHost(HostName, IPAdr, WSAErr) ТО//: WideString): WordBool; safecall;
            РЕЗУЛЬТАТ=IPAdr
     КОНЕЦ_ЕСЛИ
  КОНЕЦ_ЕСЛИ
КОНЕЦ_ФУНКЦИИ


  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 
ОтправитьПечать