VB, Cpp, COM

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

VB, Cpp, COM

Сообщение ANDLL » 10.07.2004 (Сб) 21:21

Я создаю проект типа MFC App Wizard(DLL) с поддержкой Automation.
Затем в StdAfx.h пишу

Код: Выделить всё
#import "msxml3.dll" rename_namespace("msxml3")
using namespace "msxml3";


Собственно вопросы, если не возражаете:
1. Переведите
Код: Выделить всё
Dim A as IXMLDOMNode
Set A=B.selectSingleNode("ndName")

На С++.

2. Объявляем в VB API:
Код: Выделить всё
Private Declare Function simpleFunc1 lib "simpleDLL.dll" (BYVAL node as IXMLDOMNode) as long
Private Declare Function simpleFunc2 lib "simpleDLL.dll" (BYREF node as IXMLDOMNode) as long

На C соответственно объявления будут выглядеть:
Код: Выделить всё
long WINAPI simpleFunc1(IXMLDOMNode node);
long WINAPI simpleFunc2(IXMLDOMNode*node);

Ан нет. Почему-то вариант с simpleFunc2 вообще не работает, а для simpleFunc1 приходиться на C++ объявлять (IXMLDOMNode*node)
Вообще-то странно: в VB передаем по ByVal, а в C++ пишем указатель.
Собственно вопрос:
а) почему так :?:
б) нужно ли вызывать в конце simpleFunc1 node->Release(); :?:
:?: :shock: :?: :shock: :?:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.07.2004 (Сб) 22:32

1. Хз. Сталкивался с различными именами на C++ и VB.
2. а)Ну так! Ессно... ByVal в случае с объектом - это передача не самого объекта, это как раз *. А ByRef - это **.
б) по идее нет.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 11.07.2004 (Вс) 10:46

GSerg писал(а):1. Хз. Сталкивался с различными именами на C++ и VB.


Извини, не понял.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.07.2004 (Вс) 12:10

Эээ...
Ну, в общем, не имея h, ничего не могу сказать :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Сообщение Vi » 12.07.2004 (Пн) 10:28

1.

IXMLDOMNodePtr A;
A=B.selectSingleNode("ndName");

2.

VB'шный IXMLDOMNode - это и есть этот С'ный тип - указатель на IXMLDOMNode. Поэтому описания будут

long WINAPI simpleFunc1(IXMLDOMNode* node);
long WINAPI simpleFunc2(IXMLDOMNode* * node);

2.а) Потому что это такие типы.

В С: IXMLDOMNode* var;
В VB: Dim var As IXMLDOMNode

б) нужно ли вызывать в конце simpleFunc1 node->Release();

Ни в коем случае. VB, конечно, не работает в терминах COM, но и здесь есть соответствие в передаче параметров: ByVal - это [in], а ByRef - это [in,out]. При этом справедливы все правила СОМа по подсчету ссылок. А именно, in-параметр всегда остается в собственности вызывающей функции.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, SemrushBot и гости: 21

    TopList