Re[3]: Как передать двумерный массив из COM (VC++) в C#?
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 19.10.06 13:14
Оценка: +1
Здравствуйте, <Аноним>, Вы писали:

А>НО!!! Мне нужно обращаться к СОМ находящийся на сервере в сети.

А>В этом случае на сколько я знаю, ПОЗДНЕЕ СВЯЗЫВАНИЕ НЕОБХОДИМО.

отнюдь. Если сделать как описано здесь — http://rsdn.ru/article/com/COMvs.xml
Автор(ы): Чистяков В.Ю.

Эта статья входит в цикл "COM vs. CORBA" и знакомит читателя с основами COM, начиная с интерфейса IUnknown
и заканчивая маршалингом, DCOM и COM+.
в "Установление связи с удаленным объектом" (победив все заморочки с безопасностью, хотя они в общем-то не зависят от типа связывания), то для приложения-клиента работа с удаленным COM-сервером ничем не отличается от работы с локальным.
... << RSDN@Home 1.2.0 alpha rev. 654>>
Как передать двумерный массив из COM (VC++) в C#?
От: Аноним  
Дата: 19.10.06 04:27
Оценка:
Привет, Всем!
В принципе из название следует пояснить.
Сущ COM на VC.NET 2003(ATL).
Из C# поздним связыванием обращаюсь к СОМ.
[code]int[code]овые переменные передаются, а как быть с массивом???
Помогите, мужики, чем можите...
Как передать двумерный массив из COM (VC++) в C#?
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 19.10.06 08:27
Оценка:
#Имя: FAQ.combounds.to.cs
Здравствуйте, <Аноним>, Вы писали:

А>Привет, Всем!

А>В принципе из название следует пояснить.
А>Сущ COM на VC.NET 2003(ATL).
А>Из C# поздним связыванием обращаюсь к СОМ.
А>[code]int[code]овые переменные передаются, а как быть с массивом???
А>Помогите, мужики, чем можите...

с поздним связыванием не заморачивался, так что чем смогу

COM:
-idl:
   [id(2), helpstring("method GetBinary2")] 
   HRESULT GetBinary2([out,retval] SAFEARRAY(BYTE) *arr);

-cpp:
STDMETHODIMP CTestInterface::GetBinary2(SAFEARRAY* *arr)
{
   BYTE src[2][3] = {1,2,3,4,5,6};

   LPVOID theBytes = NULL;

   CComSafeArrayBound bound[2];
   bound[0].SetCount(3);
   bound[0].SetLowerBound(0);
   bound[1].SetCount(3);
   bound[1].SetLowerBound(0);   

   CComSafeArray<BYTE> NewArray(bound, 2);
   SafeArrayAccessData( *NewArray.GetSafeArrayPtr(), &theBytes );
   memcpy( theBytes, src, sizeof(src) );
   SafeArrayUnaccessData( *NewArray.GetSafeArrayPtr() );

   *arr = NewArray.Detach();

   return S_OK;
}


далее:
tlbimp.exe comserver.dll /out:comservernet.dll /sysarray

добавляем comservernet.dll в References проекта на C#,
-С#:
using comservernet;
. . .

      private void button2_Click(object sender, EventArgs e)
      {
         TestInterface testobj = new TestInterface();

         Array arr = testobj.GetBinary2();

         resultlabel.Text = "";
         int dims = arr.Rank;

         for( int dim=0; dim < dims; dim++)
         {
            int count = arr.GetLength(dim);
            for( int n=0; n < count; n++)
            {
               resultlabel.Text += arr.GetValue(n, dim).ToString() + ", ";
            }
            resultlabel.Text += "\n";
         }
      }
... << RSDN@Home 1.2.0 alpha rev. 655>>
Re[2]: Как передать двумерный массив из COM (VC++) в C#?
От: Аноним  
Дата: 19.10.06 11:37
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>Здравствуйте, <Аноним>, Вы писали:


А>>Привет, Всем!

А>>В принципе из название следует пояснить.
А>>Сущ COM на VC.NET 2003(ATL).
А>>Из C# поздним связыванием обращаюсь к СОМ.
А>>[code]int[code]овые переменные передаются, а как быть с массивом???
А>>Помогите, мужики, чем можите...

OE>с поздним связыванием не заморачивался, так что чем смогу


Большое спасибо!!! Это работает!
НО!!! Мне нужно обращаться к СОМ находящийся на сервере в сети.
В этом случае на сколько я знаю, ПОЗДНЕЕ СВЯЗЫВАНИЕ НЕОБХОДИМО.
Читаю Троелсена, но что-то пока никак...
Здесь есть программисты???
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.