<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBS: хочу рулить AutoCAD'ом из 1С:7.7 через VBS. ??? с типами данных]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=6578&amp;type=atom" />
	<updated>2011-12-26T16:00:06Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=6578</id>
		<entry>
			<title type="html"><![CDATA[Re: VBS: хочу рулить AutoCAD'ом из 1С:7.7 через VBS. ??? с типами данных]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=54983#p54983" />
			<content type="html"><![CDATA[<p>сафемассив получается просче и симпатишнее</p>]]></content>
			<author>
				<name><![CDATA[smaharbA]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2911</uri>
			</author>
			<updated>2011-12-26T16:00:06Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=54983#p54983</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: хочу рулить AutoCAD'ом из 1С:7.7 через VBS. ??? с типами данных]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=54976#p54976" />
			<content type="html"><![CDATA[<p>1С:7.7 - понятно - легко и элегантно содавать, манипулировать, сопровождать БД (ту, которая требуется в данной прикладной задаче).<br />AutoCAD - в нем автоматом по исходным из 1С: создаются фрагменты, да и целые листы инженерной графики. Вся организация работает в Акаде, да и предыдущий опыт программирования в Ём же есть.<br />Ессно, у Автокада есть масса интерфейсов для обена данными, свои скрипты, VLISP, DIESEL, DXF и пр. но они с разной степенью успешности (далеко не идеальной) обеспечивают реальный интерактив. Хочется более коротким путем сразу из прикладной среды рулить АКАДом. Предлагаемые Chessman`ом меры решают многие проблемы, но иные остаются. Объектная модель АКАДа (правда, об этом говорится в разных источниках) выглядит и ведет себя по-разному в разных клиентских средах.<br />Например&nbsp; в связке 1С:-АКАД мало того, что есть проблемы с обменом данными, так и методы и свойства некоторые не отзываются. некоторые, вообще отсутствуют.<br />С событиями, вообще швах..Т.ч. побьюсь еще и не исключаю, откачусь к традиционным средствам без интерактива.</p>]]></content>
			<author>
				<name><![CDATA[Dbeer]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27443</uri>
			</author>
			<updated>2011-12-26T09:29:14Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=54976#p54976</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: хочу рулить AutoCAD'ом из 1С:7.7 через VBS. ??? с типами данных]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=54966#p54966" />
			<content type="html"><![CDATA[<p>OFF.<br />Прочитал название темы, видать туго соображаю, но не понял почему автокад и 1с через VBS?? В первом посте нет поставленной задачи.. поэтому я не понял принципиального принятого решения, жаль, а мое любопытство вначале пересилило меня. Не подскажите почему данные из 1 с надо в графическом редакторе Автокад обрабатывать? (1с очень хорошо дружит с екселем, например, где можно строить графики и не только..)</p>]]></content>
			<author>
				<name><![CDATA[stir]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=26486</uri>
			</author>
			<updated>2011-12-26T02:29:47Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=54966#p54966</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: хочу рулить AutoCAD'ом из 1С:7.7 через VBS. ??? с типами данных]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=54954#p54954" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>|    newArray    =    ArrayCreate(VT_VARIANT, 3)
|    MsgBox TypeName(newArray)
|
|    newArray(0)    = 15.56
|    MsgBox newArray(0)</code></pre></div><p>Чтобы создать массив типа Double, нужно VT_VARIANT заменить на VT_R8. &quot;3&quot; - размерность массива. <br />Соответственно, после этого ни присвоить, ни получить значения массива штатным способом не получится.<br />Но мы уже знаем, как это сделать &quot;нештатным&quot; образом.</p><p>ЗЫ: (для массива типа Double) нам с одной стороны нужен&nbsp; указатель на массив, чтобы манипулировать значениями элементов,&nbsp; а с другой&nbsp; переменная типа &quot;Array&quot; в vbs&#039;e, чтобы ее передать дальше в AutoCAD. Сейчас ф-я ArrayCreate возвращает переменную типа Array. Чтобы не делать лишних телодвижений, по получению указателя на массив, можно сам указатель хранить в какой-то глобальной переменной(нужно поправить ф-ю ArrayCreate в классе Service).</p>]]></content>
			<author>
				<name><![CDATA[chessman]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=25359</uri>
			</author>
			<updated>2011-12-25T10:14:56Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=54954#p54954</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: хочу рулить AutoCAD'ом из 1С:7.7 через VBS. ??? с типами данных]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=54953#p54953" />
			<content type="html"><![CDATA[<p>Добавлен код создания массива &quot;нештатными&quot; для vbs средствами</p><div class="codebox"><pre><code>|Public Const     PAGE_EXECUTE_READWRITE    = &amp;h40
|Public Const     HEAP_ZERO_MEMORY        = &amp;h08
|Public Const     VT_R8                   = 5
|Public Const     VT_VARIANT              = 12    
|Public Const     VT_ARRAY                  = &amp;h2000 
|&#039;============================================
|Public Wrap
|Set Wrap = CreateObject(&quot;&quot;DynamicWrapperX&quot;&quot;)
|
|Public oServ
|Public Point
|&#039;============================================
|
|Class    Service
|    Private hHeap
|    Private    ppv
|    Private    pVal
|    Private    pFlag    
|    Private    addrParamTypesAvailable
|    Private    rgsabound
|    Private        DllSeg    
|
|    Private Sub Class_Initialize
|        &#039;Необходимые функции
|        Wrap.Register &quot;&quot;Kernel32&quot;&quot;,    &quot;&quot;LoadLibrary&quot;&quot; , &quot;&quot;i=s&quot;&quot;, &quot;&quot;r=h&quot;&quot;
|        Wrap.Register &quot;&quot;Kernel32&quot;&quot;,    &quot;&quot;GetProcAddress&quot;&quot; , &quot;&quot;i=hs&quot;&quot;, &quot;&quot;r=u&quot;&quot;
|        Wrap.Register &quot;&quot;Kernel32&quot;&quot;,    &quot;&quot;VirtualProtect&quot;&quot; , &quot;&quot;i=lllp&quot;&quot;, &quot;&quot;r=l&quot;&quot;
|        Wrap.Register &quot;&quot;Kernel32&quot;&quot;,    &quot;&quot;HeapAlloc&quot;&quot;,    &quot;&quot;i=lll&quot;&quot;,    &quot;&quot;r=l&quot;&quot;
|        Wrap.Register &quot;&quot;Kernel32&quot;&quot;,    &quot;&quot;GetProcessHeap&quot;&quot;, &quot;&quot;r=l&quot;&quot;
|        Wrap.Register &quot;&quot;Kernel32&quot;&quot;,    &quot;&quot;HeapFree&quot;&quot;, &quot;&quot;i=lll&quot;&quot;,&quot;&quot;r=l&quot;&quot;
|        
|        Wrap.Register &quot;&quot;Oleaut32&quot;&quot;,    &quot;&quot;SafeArrayCreate&quot;&quot;, &quot;&quot;i=llp&quot;&quot;,&quot;&quot;r=l&quot;&quot;    
|        Wrap.Register &quot;&quot;Oleaut32&quot;&quot;,    &quot;&quot;SafeArrayGetDim&quot;&quot;, &quot;&quot;i=p&quot;&quot;,&quot;&quot;r=l&quot;&quot;
|        Wrap.Register &quot;&quot;Oleaut32&quot;&quot;,    &quot;&quot;SafeArrayGetElement&quot;&quot;, &quot;&quot;i=plp&quot;&quot;,&quot;&quot;r=l&quot;&quot;
|        Wrap.Register &quot;&quot;Oleaut32&quot;&quot;,    &quot;&quot;SafeArrayPutElement&quot;&quot;, &quot;&quot;i=plp&quot;&quot;,&quot;&quot;r=l&quot;&quot;
|        
|        &#039;Выделяем память под результат
|        hHeap    = Wrap.GetProcessHeap() 
|        ppv        = Wrap.HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 4)
|        pFlag    = Wrap.HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 4)
|        pVal    = Wrap.HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 16)
|        rgsabound = Wrap.HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 8)
|        
|        
|        &#039;Для патча DWX налету
|        &#039;=============================================================
|        handle = Wrap.LoadLibrary(&quot;&quot;dynwrapx&quot;&quot;)
|        Addr   = Wrap.GetProcAddress(handle, &quot;&quot;DllGetClassObject&quot;&quot;)
|        DllSeg = Addr And &amp;hFFFF0000
|        
|        Offset                         = &amp;h41C8 + 10        &#039;VT_Dispatch
|        addrParamTypesAvailable     = DllSeg + Offset
|        &#039;=============================================================
|        Wrap.VirtualProtect addrParamTypesAvailable, 2, PAGE_EXECUTE_READWRITE, pFlag
|    End Sub
|    
|    Private Sub Class_Terminate
|        Wrap.VirtualProtect addrParamTypesAvailable, 2, Wrap.NumGet(pFlag), pFlag
|        Wrap.HeapFree hHeap, 0, ppv
|        Wrap.HeapFree hHeap, 0, pFlag
|        Wrap.HeapFree hHeap, 0, pVal
|        Wrap.HeapFree hHeap, 0, rgsabound
|    End Sub
|    
|    Public Function GetSafeArray(Arr)
|        &#039;Учим DWX принимать массив
|        vtType = Wrap.NumGet(addrParamTypesAvailable, 0, &quot;&quot;t&quot;&quot;)    
|        Wrap.NumPut VarType(Arr), addrParamTypesAvailable, 0, &quot;&quot;t&quot;&quot;    
|        
|        &#039;Получим указатель на SafeArray
|        GetSafeArray = Wrap.GetIDispatch(Arr)
|        
|        &#039;Возвращаем статус-кво
|        Wrap.NumPut vtType, addrParamTypesAvailable, 0, &quot;&quot;t&quot;&quot;    
|    End Function
|    
|    Public Function GetElement(pSafeArray, ind)
|        Wrap.NumPut ind, ppv
|        Wrap.SafeArrayGetElement pSafeArray, ppv, pVal
|        
|        GetElement = Wrap.NumGet(pVal, 8, &quot;&quot;d&quot;&quot;)
|    End Function
|    
|    Public Function PutElement(pSafeArray, ind, vl)
|        &#039;Тип Variant - VT_R8
|        Wrap.NumPut    VT_R8, pVal, 0, &quot;&quot;t&quot;&quot;    
|        &#039;Значение Variant
|        Wrap.NumPut    vl, pVal, 8, &quot;&quot;d&quot;&quot;    
|        
|        Wrap.NumPut ind, ppv
|        Wrap.SafeArrayPutElement pSafeArray, ppv, pVal
|    End Function
|    
|    Public Function ArrayCreate(vt, cElements)
|        &#039;Структура SAFEARRAYBOUND
|        Wrap.NumPut cElements, rgsabound, 0
|        Wrap.NumPut 0         , rgsabound, 4
|        
|        pSA = Wrap.SafeArrayCreate(vt, 1, rgsabound)
|        
|        &#039;Научим DWX возвращать массивы
|        &#039;=============================================================
|        addr = DllSeg + &amp;h278D
|        Wrap.VirtualProtect addr, 8, PAGE_EXECUTE_READWRITE, pFlag
|        
|        &#039;Запоминаем участок памяти
|        mem1 = Wrap.NumGet(addr, 0)
|        mem2 = Wrap.NumGet(addr, 4)
|        
|        &#039;Меняем участок памяти
|        Wrap.NumPut    &amp;h90909090, addr, 0 
|        Wrap.NumPut    &amp;h90909090, addr, 4
|        
|        Wrap.NumPut    VT_ARRAY + vt, addr, 0, &quot;&quot;t&quot;&quot;
|        
|        ArrayCreate = Wrap.GetObject(pSA)
|
|        &#039;Возвращаем статус-кво
|        Wrap.NumPut    mem1, addr, 0 
|        Wrap.NumPut    mem2, addr, 4
|        &#039;=============================================================
|    End Function
|End Class
|
|Set oServ = New Service
|
|&#039;===========================================================
|Public Function GetSafeArray(Arr)
|    GetSafeArray = oServ.GetSafeArray(Arr)
|End Function
|
|Public Function GetElement(pSafeArray, ind)
|    GetElement = oServ.GetElement(pSafeArray, ind)
|End Function
|
|Public Function PutElement(pSafeArray, ind, vl)
|    oServ.PutElement pSafeArray, ind, vl
|End Function
|
|Public Function ArrayCreate(vt, cElements)
|    ArrayCreate = oServ.ArrayCreate(vt, cElements)
|End Function
|
|Public Function Test()
|    pArr = GetSafeArray(Point)
|    
|    item0 = GetElement(pArr, 0)
|    item1 = GetElement(pArr, 1)
|    
|    MsgBox &quot;&quot;item0 = &quot;&quot; &amp; CSTR(item0)
|    MsgBox &quot;&quot;item1 = &quot;&quot; &amp; CSTR(item1)
|    
|    PutElement pArr, 0, 3.14
|    MsgBox &quot;&quot;item0 = &quot;&quot; &amp; CSTR(Point(0))
|    
|    newArray    =    ArrayCreate(VT_VARIANT, 3)    
|    MsgBox TypeName(newArray)
|
|    newArray(0)    = 15.56
|    MsgBox newArray(0)
|End Function
|&#039;===========================================================
|
|Point     = Array(10.454, 11.56944656, 12, 15, 25)
|&quot;;</code></pre></div>]]></content>
			<author>
				<name><![CDATA[chessman]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=25359</uri>
			</author>
			<updated>2011-12-25T10:09:06Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=54953#p54953</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: хочу рулить AutoCAD'ом из 1С:7.7 через VBS. ??? с типами данных]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=54936#p54936" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Dbeer пишет:</cite><blockquote><p>Но проблема с созданием контейнера с нуля остается..</p></blockquote></div><p>Нам потребуется функция SafeArrayCreate<br /><a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms221234(v=vs.85).aspx">http://msdn.microsoft.com/en-us/library … s.85).aspx</a></p><p>она возвращает указатель на SafeArray <img src="//forum.script-coding.com/img/smilies/tongue.png" width="15" height="15" />.<br />Все остальное мы делать уже умеем(получить/поместить элемент).</p><p>Остается только&nbsp; научить DWX возвращать массив.</p>]]></content>
			<author>
				<name><![CDATA[chessman]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=25359</uri>
			</author>
			<updated>2011-12-24T14:22:55Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=54936#p54936</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: хочу рулить AutoCAD'ом из 1С:7.7 через VBS. ??? с типами данных]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=54926#p54926" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Dbeer пишет:</cite><blockquote><p>…(I или II-ой?)</p></blockquote></div><p>Последнее.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2011-12-24T04:51:41Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=54926#p54926</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: хочу рулить AutoCAD'ом из 1С:7.7 через VBS. ??? с типами данных]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=54925#p54925" />
			<content type="html"><![CDATA[<p>Sorry, за OFF, конечно. Но ведь, я, как раз, об этом - адрес нужен реальный. Разберемся..С новым Годом!! Alexii (I или II-ой?)</p>]]></content>
			<author>
				<name><![CDATA[Dbeer]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27443</uri>
			</author>
			<updated>2011-12-24T04:03:28Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=54925#p54925</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: хочу рулить AutoCAD'ом из 1С:7.7 через VBS. ??? с типами данных]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=54923#p54923" />
			<content type="html"><![CDATA[<p>OFF:<br /></p><div class="quotebox"><cite>Dbeer пишет:</cite><blockquote><p>Ну не могу же я тебе по интернету пива послать или еще чего..tongue</p></blockquote></div><p>Есть службы доставки, если что <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2011-12-24T02:31:54Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=54923#p54923</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: хочу рулить AutoCAD'ом из 1С:7.7 через VBS. ??? с типами данных]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=54894#p54894" />
			<content type="html"><![CDATA[<p>Погорячился я, видимо, если pArr - это указатель, а не значение, то тогда так и д.б.<br />Т.е. &quot;PutElement pArr, 0, 3.14&quot; запихивает правильно число Pi в адрес, вычисляемый от pArr по индексу.<br />А в POINT уже лежит готовый измененный массив.<br />Но проблема с созданием контейнера с нуля остается..</p>]]></content>
			<author>
				<name><![CDATA[Dbeer]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27443</uri>
			</author>
			<updated>2011-12-23T14:17:05Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=54894#p54894</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: хочу рулить AutoCAD'ом из 1С:7.7 через VBS. ??? с типами данных]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=54893#p54893" />
			<content type="html"><![CDATA[<p>Пока не пробовал, изучал &quot;всухую&quot;.<br />Почти понятно. Только вот что смущает:</p><div class="codebox"><pre><code>|Public Function Test()
|    pArr = GetSafeArray(Point) &#039; здесь я конвертирую в съедобную форму то, что мне вернулось из автокада
|
|    PutElement pArr, 0, 3.14     &#039; а здесь наверное д.б. :
                                               PutElement Point, 0, 3.14 ????
|    MsgBox &quot;&quot;item0 = &quot;&quot; &amp; CSTR(Point(0))
|End Function</code></pre></div><p>получается, что сначала я должен получить из Автокада Point, тем самым получив ссылку на созданный Автокадом массив,<br />и потом его использовать, как контейнер для УЖЕ моих данных (запихивать туда свои цифры и снова передавать АвтоКаду).<br />А как самому с нуля создать такой контейнер?</p>]]></content>
			<author>
				<name><![CDATA[Dbeer]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27443</uri>
			</author>
			<updated>2011-12-23T14:10:57Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=54893#p54893</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: хочу рулить AutoCAD'ом из 1С:7.7 через VBS. ??? с типами данных]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=54891#p54891" />
			<content type="html"><![CDATA[<p><img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> на самом деле самому было интересно, так что просто enjoy!&nbsp; <img src="//forum.script-coding.com/img/smilies/big_smile.png" width="15" height="15" /></p>]]></content>
			<author>
				<name><![CDATA[chessman]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=25359</uri>
			</author>
			<updated>2011-12-23T13:51:30Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=54891#p54891</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: хочу рулить AutoCAD'ом из 1С:7.7 через VBS. ??? с типами данных]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=54890#p54890" />
			<content type="html"><![CDATA[<p>СПасибо огромное за участие. Опробую завтра с утра - работаем за Новый Год. Доложу.<br />Сообщи мне на мыло какой-нить почтовый адрес - вышлю посылочку..Жажду отомстить<br />Ну не могу же я тебе по интернету пива послать или еще чего..:P</p>]]></content>
			<author>
				<name><![CDATA[Dbeer]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27443</uri>
			</author>
			<updated>2011-12-23T13:31:27Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=54890#p54890</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: хочу рулить AutoCAD'ом из 1С:7.7 через VBS. ??? с типами данных]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=54889#p54889" />
			<content type="html"><![CDATA[<p>Теперь исправления для Double, к тем, что уже были</p><div class="codebox"><pre><code>|    Public Function PutElement(pSafeArray, ind, vl)
|        Wrap.NumPut    vl, pVal, 0, &quot;&quot;d&quot;&quot;    
|
|        Wrap.NumPut ind, ppv
|        Wrap.SafeArrayPutElement pSafeArray, ppv, pVal
|    End Function</code></pre></div><p>ну и соответственно убрать MsgBox из Test</p><div class="codebox"><pre><code>MsgBox &quot;&quot;item0 = &quot;&quot; &amp; CSTR(Point(0))</code></pre></div><p>т.к. ругнется на Тип значения</p><p>В общем жду результатов.</p>]]></content>
			<author>
				<name><![CDATA[chessman]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=25359</uri>
			</author>
			<updated>2011-12-23T13:26:59Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=54889#p54889</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: хочу рулить AutoCAD'ом из 1С:7.7 через VBS. ??? с типами данных]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=54888#p54888" />
			<content type="html"><![CDATA[<p>Итоговый скрипт, сначала получаем &quot;нештатным для vbs&quot; образом значения элементов массива, потом нештатным присваиваем значение.<br />(Скрипт для массива из VARIANT&#039;ов. Для Double напишу ниже.)</p><div class="codebox"><pre><code>|Public Const     PAGE_EXECUTE_READWRITE    = &amp;h40
|Public Const     HEAP_ZERO_MEMORY        = &amp;h08
|Public Const     VT_R8                   = &amp;h5
|&#039;============================================
|Public Wrap
|Set Wrap = CreateObject(&quot;&quot;DynamicWrapperX&quot;&quot;)
|
|Public oServ
|Public Point
|&#039;============================================
|
|Class    Service
|    Private hHeap
|    Private    ppv
|    Private    pVal
|    Private    pFlag    
|    Private    addrParamTypesAvailable
|
|    Private Sub Class_Initialize
|        &#039;Необходимые функции
|        Wrap.Register &quot;&quot;Kernel32&quot;&quot;,    &quot;&quot;LoadLibrary&quot;&quot; , &quot;&quot;i=s&quot;&quot;, &quot;&quot;r=h&quot;&quot;
|        Wrap.Register &quot;&quot;Kernel32&quot;&quot;,    &quot;&quot;GetProcAddress&quot;&quot; , &quot;&quot;i=hs&quot;&quot;, &quot;&quot;r=u&quot;&quot;
|        Wrap.Register &quot;&quot;Kernel32&quot;&quot;,    &quot;&quot;VirtualProtect&quot;&quot; , &quot;&quot;i=lllp&quot;&quot;, &quot;&quot;r=l&quot;&quot;
|        Wrap.Register &quot;&quot;Kernel32&quot;&quot;,    &quot;&quot;HeapAlloc&quot;&quot;,    &quot;&quot;i=lll&quot;&quot;,    &quot;&quot;r=l&quot;&quot;
|        Wrap.Register &quot;&quot;Kernel32&quot;&quot;,    &quot;&quot;GetProcessHeap&quot;&quot;, &quot;&quot;r=l&quot;&quot;
|        Wrap.Register &quot;&quot;Kernel32&quot;&quot;,    &quot;&quot;HeapFree&quot;&quot;, &quot;&quot;i=lll&quot;&quot;,&quot;&quot;r=l&quot;&quot;
|
|        Wrap.Register &quot;&quot;Oleaut32&quot;&quot;,    &quot;&quot;SafeArrayGetDim&quot;&quot;, &quot;&quot;i=p&quot;&quot;,&quot;&quot;r=l&quot;&quot;
|        Wrap.Register &quot;&quot;Oleaut32&quot;&quot;,    &quot;&quot;SafeArrayGetElement&quot;&quot;, &quot;&quot;i=plp&quot;&quot;,&quot;&quot;r=l&quot;&quot;
|        Wrap.Register &quot;&quot;Oleaut32&quot;&quot;,    &quot;&quot;SafeArrayPutElement&quot;&quot;, &quot;&quot;i=plp&quot;&quot;,&quot;&quot;r=l&quot;&quot;
|
|        &#039;Выделяем память под результат
|        hHeap    = Wrap.GetProcessHeap() 
|        ppv        = Wrap.HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 4)
|        pFlag    = Wrap.HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 4)
|        pVal    = Wrap.HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 16)
|
|        &#039;Для патча DWX налету
|        &#039;=============================================================
|        handle = Wrap.LoadLibrary(&quot;&quot;dynwrapx&quot;&quot;)
|        Addr   = Wrap.GetProcAddress(handle, &quot;&quot;DllGetClassObject&quot;&quot;)
|        DllSeg = Addr And &amp;hFFFF0000
|
|        Offset                         = &amp;h41C8 + 10        &#039;VT_Dispatch
|        addrParamTypesAvailable     = DllSeg + Offset
|        &#039;=============================================================
|        Wrap.VirtualProtect addrParamTypesAvailable, 2, PAGE_EXECUTE_READWRITE, pFlag
|    End Sub
|    
|    Private Sub Class_Terminate
|        Wrap.VirtualProtect addrParamTypesAvailable, 2, Wrap.NumGet(pFlag), pFlag
|        Wrap.HeapFree hHeap, 0, ppv
|        Wrap.HeapFree hHeap, 0, pFlag
|        Wrap.HeapFree hHeap, 0, pVal
|    End Sub
|
|    Public Function GetSafeArray(Arr)
|        &#039;Учим DWX принимать массив
|        vtType = Wrap.NumGet(addrParamTypesAvailable, 0, &quot;&quot;t&quot;&quot;)    
|        Wrap.NumPut VarType(Arr), addrParamTypesAvailable, 0, &quot;&quot;t&quot;&quot;    
|
|        &#039;Получим указатель на SafeArray
|        GetSafeArray = Wrap.GetIDispatch(Arr)
|        
|        &#039;Возвращаем статус-кво
|        Wrap.NumPut vtType, addrParamTypesAvailable, 0, &quot;&quot;t&quot;&quot;    
|    End Function
|
|    Public Function GetElement(pSafeArray, ind)
|        Wrap.NumPut ind, ppv
|        Wrap.SafeArrayGetElement pSafeArray, ppv, pVal
|
|        GetElement = Wrap.NumGet(pVal, 8, &quot;&quot;d&quot;&quot;)
|    End Function
|
|    Public Function PutElement(pSafeArray, ind, vl)
|        &#039;Тип Variant - VT_R8
|        Wrap.NumPut    VT_R8, pVal, 0, &quot;&quot;t&quot;&quot;    
|        &#039;Значение Variant
|        Wrap.NumPut    vl, pVal, 8, &quot;&quot;d&quot;&quot;    
|
|        Wrap.NumPut ind, ppv
|        Wrap.SafeArrayPutElement pSafeArray, ppv, pVal
|    End Function
|
|End Class
|
|Set oServ = New Service
|
|&#039;===========================================================
|Public Function GetSafeArray(Arr)
|    GetSafeArray = oServ.GetSafeArray(Arr)
|End Function
|
|Public Function GetElement(pSafeArray, ind)
|    GetElement = oServ.GetElement(pSafeArray, ind)
|End Function
|
|Public Function PutElement(pSafeArray, ind, vl)
|    oServ.PutElement pSafeArray, ind, vl
|End Function
|
|Public Function Test()
|    pArr = GetSafeArray(Point)
|
|    item0 = GetElement(pArr, 0)
|    item1 = GetElement(pArr, 1)
|
|    MsgBox &quot;&quot;item0 = &quot;&quot; &amp; CSTR(item0)
|    MsgBox &quot;&quot;item1 = &quot;&quot; &amp; CSTR(item1)
|
|    PutElement pArr, 0, 3.14
|    MsgBox &quot;&quot;item0 = &quot;&quot; &amp; CSTR(Point(0))
|End Function
|&#039;===========================================================
|
|Point     = Array(10.454, 11.56944656, 12, 15, 25)
|&quot;;</code></pre></div>]]></content>
			<author>
				<name><![CDATA[chessman]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=25359</uri>
			</author>
			<updated>2011-12-23T13:23:05Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=54888#p54888</id>
		</entry>
</feed>
