powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как использовать API если есть исходные коды C++ но нет документации для VB
18 сообщений из 18, страница 1 из 1
Как использовать API если есть исходные коды C++ но нет документации для VB
    #35887802
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть интересная dll
Она поддерживает API
C API работать я умею давно
Но все те API как правило от Microsoft, все прописано в документациях, все примеры при наличии навыков ищутся.

А здесь примеров в принципе нет, хотя все объявления в исходных кодах я вижу, напр.
Код: plaintext
OpalHandle OPAL_EXPORT OpalInitialise(unsigned * version, const char * options);
При попытке написать в VB что-то типа

Код: plaintext
Public Declare Function OpalInitialise Lib "opal.dll" (ByVal version As Integer, ByVal options As String) As Long
ничего не получается, в общем туплю как могу

Какой здесь вообще подход может быть, потому как управлять данной библиотекой из VB было бы очень интересно. Чутье подсказывает что это очень даже возможно, но понять принципы пока не могу, т.е. нужны какие-то примеры, а какие - неясно. Там всего-то 4 функции

To make the above easier, there are only four functions: OpalInitialise(),
OpalShutDown(), OpalGetMessage() and OpalSendMessage(). All commands to OPAL and
indications back from OPAL are done through the latter two functions.
Late binding also allows for easier integration of OPAL fucntionality to
interpreted languages such as Java, Perl etc.


Лезть к авторам с вопросами по VB бесполезно, они его точно не знают и в лучшем случае будут какие-то общие слова типа тех что я привел.

И другой вопрос. Что значит прилинковать библиотеку?
Добавить ее в References и пользоваться ее объектами? Ну, с этой так не получается.
...
Рейтинг: 0 / 0
Как использовать API если есть исходные коды C++ но нет документации для VB
    #35887824
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попроси .h файлы этой библиотечки и посмотри как объявлены функции. для VB нужно, чтобы были _stdcall, если там _cdecl, то ничего не выйдет. писать придеться обертку или tlb делать. обертку в таком случае лучше делать на .NET там проще с декларациями.
...
Рейтинг: 0 / 0
Как использовать API если есть исходные коды C++ но нет документации для VB
    #35888170
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, с исходными кодами проблем нету
Код: plaintext
1.
#ifdef _WIN32
  #define OPAL_EXPORT __stdcall
Мне начинать радоваться?

Или продолжать огорчаться? Потому как дальше идет темный лес и эту struct переводить непонятно как...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
OpalHandle OPAL_EXPORT OpalInitialise(unsigned * version, const char * options)
typedef struct OpalHandleStruct * OpalHandle;
struct OpalHandleStruct
{
  OpalHandleStruct(unsigned version, const PCaselessString & options)
    : process(options)
    , manager(version)
  {
  }

  PProcess_C     process;
  OpalManager_C  manager;
};
...
Рейтинг: 0 / 0
Как использовать API если есть исходные коды C++ но нет документации для VB
    #35888216
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у вас функция указатель на структуру возвращает, поэтому для VB только так:

Код: plaintext
Public Declare Function OpalInitialise Lib "opal.dll" (ByVal version As Integer, ByVal options As String) As Long

а вот дальше что делать, уже не совсем ясно. возможно можно как-то читать из памяти по данному указателю CopyMemory и тп в аналогичную структуру. все-таки лучше я думаю попробовать сделать com-обёртку на C++.
...
Рейтинг: 0 / 0
Как использовать API если есть исходные коды C++ но нет документации для VB
    #35888581
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да, я точно также написал.
Однако,
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Public Declare Function OpalInitialise Lib "opal.dll" (ByVal version As Integer, ByVal options As String) As Long
Public Declare Function OpalShutDown Lib "opal.dll" (ByVal handle As Long) As Long
'-----
Dim L As Long
Private Sub Command1_Click()
    L = OpalInitialise( 0 , "sip")
    MsgBox L
End Sub

Private Sub Command2_Click()
    Dim S As Long
    S = OpalShutDown(L)
    MsgBox S
End Sub
При нажатии на Command1 возвращается ба-льшое число (OpalHandle)
А потом при нажатии на Command2 возвращается 1
Код: plaintext
1.
2.
3.
 void OPAL_EXPORT OpalShutDown(OpalHandle handle)
  {
    delete handle;
  }
Ну т.е. получается, удалось инициализирововать и закрыть монстра.
При этом правда странно, что если после command2 (и возврата 1) снова нажать Command1, то vb вылетает, т.е. можно один раз открыть -закрыть...

Ну, т.е. теперь надо разбираться с оставшимися 2-мя API, которые собственно и командуют парадом.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
  OpalMessage * OPAL_EXPORT OpalGetMessage(OpalHandle handle, unsigned timeout)
  {
    return handle == NULL ? NULL : handle->manager.GetMessage(timeout);
  }


  OpalMessage * OPAL_EXPORT OpalSendMessage(OpalHandle handle, const OpalMessage * message)
  {
    return handle == NULL ? NULL : handle->manager.SendMessage(message);
  }

Ну, по идее писать их надо так
Код: plaintext
1.
Public Declare Function OpalGetMessage Lib "opal.dll" (ByVal handle As Long, ByVal timeout As Integer) As OpalMessage
Public Declare Function OpalSendMessage Lib "opal.dll" (ByVal handle As Long, ByVal message As OpalMessage) As OpalMessage

Вот только с "OpalMessage" типом придется попотеть, очевидно расписывать, что там есть что, следуя C++ коду.

Ну, конечно двумя строчками уже не ограничишься, придется сочинять...,сравнивать с примерами других модулей, пытаться запустить те процедуры, которые для меня более менее понятны с т.зр. C++-примеров
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
struct OpalMessage {
  OpalMessageType m_type;   ///< Type of message
  union {
    const char *             m_commandError;       ///< Used by OpalIndCommandError
    OpalParamGeneral         m_general;            ///< Used by OpalCmdSetGeneralParameters
    OpalParamProtocol        m_protocol;           ///< Used by OpalCmdSetProtocolParameters
    OpalParamRegistration    m_registrationInfo;   ///< Used by OpalCmdRegistration
    OpalStatusRegistration   m_registrationStatus; ///< Used by OpalIndRegistrationStatus
    OpalParamSetUpCall       m_callSetUp;          ///< Used by   } m_param;
...
};
typedef struct OpalParamSetUpCall {
  const char * m_partyA;      /**< A-Party for call.
  const char * m_partyB;      /**< B-Party for call. This is typically a remote host URL
 ...
...
Рейтинг: 0 / 0
Как использовать API если есть исходные коды C++ но нет документации для VB
    #35888802
unsigned * version -> [ByRef] version As Long
...
Рейтинг: 0 / 0
Как использовать API если есть исходные коды C++ но нет документации для VB
    #35888874
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77
Код: plaintext
OpalHandle OPAL_EXPORT OpalInitialise(unsigned * version, const char * options);
При попытке написать в VB что-то типа

Код: plaintext
Public Declare Function OpalInitialise Lib "opal.dll" (ByVal version As Integer, ByVal options As String) As Long
ничего не получается, в общем туплю как могуЗвездочку в определении параметра видишь? Думаешь она там просто так стоит? :)
Замени ByVal на ByRef.
...
Рейтинг: 0 / 0
Как использовать API если есть исходные коды C++ но нет документации для VB
    #35889128
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Угу... заменил теперь вот так не вылетает
Код: plaintext
    L = OpalInitialise( 16 , "sip")
Думаю число 16 более правильное, ибо
Код: plaintext
#define OPAL_C_API_VERSION  16 
Ну а const char * options наверно все же ByVal options As String
char* -строка(string) char -один символ

Дальше, я понял, предстоит нехилая каскадная работа, по расшифровке OpalMessageType
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
struct OpalMessage {
  OpalMessageType m_type;   ///< Type of message
  union {
    const char *             m_commandError;       ///< Used by OpalIndCommandError
    OpalParamGeneral         m_general;            ///< Used by OpalCmdSetGeneralParameters
    OpalParamProtocol        m_protocol;           ///< Used by OpalCmdSetProtocolParameters
........
  } m_param;
};
struct это type
enum это enum
const char * это string
unsigned это long (int лучше избегать, это уже понял)
Примерно так...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Public Type OpalMessage
    m_type As OpalMessageType
    m_param As 'WHAT?????
    m_general As OpalParamGeneral
    .....
End Type
Public Enum OpalMessageType
    OpalIndCommandError =  0 
    OpalCmdSetGeneralParameters =  1 
    OpalCmdSetProtocolParameters =  2 
.....
End Enum
Public Type OpalParamGeneral
  m_audioRecordDevice As String
  m_audioPlayerDevice As String
....
End Type
'и т.д.до бесконечности по тексту пока все не сведется к понятным String-Long

А что ж такое
union {
} m_param;
и как эту хрень переводить на VB?
...
Рейтинг: 0 / 0
Как использовать API если есть исходные коды C++ но нет документации для VB
    #35889146
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как использовать API если есть исходные коды C++ но нет документации для VB
    #35889196
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One, вопрос там задан похожий, но за возможность просмотра ответа с меня требуют данные кредитки, чего мне не очень нравится, м.б. есть еще где посмотреть.
...
Рейтинг: 0 / 0
Как использовать API если есть исходные коды C++ но нет документации для VB
    #35889223
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I have converted C/C++ Header files to VB plenty of times but the following combination looks to be more difficult:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
typedef struct{
               BYTE G0operationCD;

               union
                    {
                     BYTE G0logicalUnitFld;

                     struct
                           {
                            BYTE G0rsvdBit1          :  2 ;
                            BYTE G0selfTest          :  1 ;
                            BYTE G0rsvdBit2          :  2 ;
                            BYTE G0LogicalUnitNumber :  3 ;
                           };
                    };

               BYTE G0rsvd1;
               BYTE G0rsvd2;
               BYTE G0length;

               union
                    {
                     BYTE G0flgLinkFld;

                     struct
                           {
                            BYTE                    G0Link     :  1 ;
                            BYTE                    G0Flag     :  1 ;
                            BYTE                    G0rsvdBit3 :  6 ;
                           };
                    };
} MST_CDB_GROUP0;

Any ideas?Start Free Trial



==============================
Basically, 'union' keyword specifies that it's either one or another. In VB this would be EXACTLY translated into something like this:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Type ByteForUnion
    MyValue As Byte
End Type

Type MST_CDB_GROUP0
    G0operationCD As Byte
    G0logicalUnitFld As ByteForUnion
    G0flgLinkFld As ByteForUnion
End Type

But you can simply do it like this:

Код: plaintext
1.
2.
3.
4.
Type MST_CDB_GROUP0
    G0operationCD As Byte
    G0logicalUnitFld As Byte
    G0flgLinkFld As Byte
End Type

Either of these methods will give you a VB user-defined type with the exact same size (in bytes) as your C structure. In your code those you'll need to use bit operations to retrieve
the fields. Assume, you are using the second construct and also note that VB does not have bitwise shift operators. You will use the following code to access the fields denoted as BYTE ... : x (basically declared as bits). Say, you have

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Dim MyStruct as MSG_CDB_GROUP0

G0rsvdBit1 = (MyStruct.G0logicalUnitFld Div  64 ) And &H3
G0selfTest = (MyStruct.G0logicalUnitFld Div  32 ) And &H1
G0rsvdBit2 = (MyStruct.G0logicalUnitFld Div  8 ) And &H3
G0LogicalUnitNumber = MyStruct.G0logicalUnitFld And &H7

G0Link = (MyStruct.G0flgLinkFld Div  128 ) And &H1
G0Flag = (MyStruct.G0flgLinkFld Div  64 ) And &H1
G0rsvdBit3 = MyStruct.G0flgLinkFld Div &H3F

You can also wrap the structure in a class and write methods for accessing the bit fields.
...
Рейтинг: 0 / 0
Как использовать API если есть исходные коды C++ но нет документации для VB
    #35889230
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вообще тут смотрел?
...
Рейтинг: 0 / 0
Как использовать API если есть исходные коды C++ но нет документации для VB
    #35889512
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мудрено, однако.
Ну, причем тут MobilOpal, я так и не врубился, но с union некое соображение-таки возникло.
Если неправ, поправьте, пока далеко не ушел.
Вот значит структура.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
struct OpalMessage {
  OpalMessageType m_type;   ///< Type of message
  union {
    const char *             m_commandError;       ///< Used by OpalIndCommandError
    OpalParamGeneral         m_general;            ///< Used by OpalCmdSetGeneralParameters
    OpalParamProtocol        m_protocol;           ///< Used by OpalCmdSetProtocolParameters
........
  } m_param;
};
В ней два параметра
1) m_type (какого типа этот Message)
2) m_param , кот. в зависимости от значения m_type может обладать только одним свойством конструкции union.
Здравый смысл подсказывает следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Private Type OpalMessage
    m_type As OpalMessageType
    m_param As MyUnionTipe
End Type
Private Enum OpalMessageType
    OpalIndCommandError =  0 
    OpalCmdSetGeneralParameters =  1 
    OpalCmdSetProtocolParameters =  2 
...
End Enum
Private Type MyUnionTipe
    m_commandError As String                       '< Used by OpalIndCommandError
    m_general As OpalParamGeneral                  '< Used by OpalCmdSetGeneralParameters
    m_protocol As OpalParamProtocol                '< Used by OpalCmdSetProtocolParameters
...
End Type
А далее уже понятней:
если напр. мы получили Message1, проверяем его свойство Message1.m_type, и если, скажем, оно равно 0, т.е. OpalIndCommandError, то читаем описание ошибки как:
Message1.m_param.m_commandError, а все остальное что содержится в Union, нас не интересует, там очевидно, ничего больше и нет.

А если,скажем мы хотим послать системе Message2,скажем, установить stunServer, то, наверно надо будет писать:
Код: plaintext
1.
Message2.m_type= 1    'OpalCmdSetGeneralParameters
Message2.m_param.m_general.m_stunServer = "myserver.com"
Надеюсь, что не ошибаюсь...
...
Рейтинг: 0 / 0
Как использовать API если есть исходные коды C++ но нет документации для VB
    #35889791
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
Public Declare Function OpalInitialise Lib "opal.dll" (ByRef version As Long, ByVal options As String) As Long
Public Declare Function OpalShutDown Lib "opal.dll" (ByVal handle As Long) As Long
Public Declare Function OpalGetMessage Lib "opal.dll" (ByVal handle As Long, ByRef timeout As Long) As OpalMessage
Public Declare Function OpalSendMessage Lib "opal.dll" (ByVal handle As Long, ByRef Message As OpalMessage) As OpalMessage
Public Declare Function OpalFreeMessage Lib "opal.dll" (ByRef Message As OpalMessage) As Long

Типов натолкал в этот несчастный модуль вагон...

Чего бы не делал в духе,
Код: plaintext
1.
2.
3.
4.
    Dim NewMes As OpalMessage
    Dim BackMes As OpalMessage
    NewMes.m_type = ...
    NewMes.m_param....
    NewMes.m_param....

Код: plaintext
    BackMes = OpalSendMessage(L, NewMes) 
выдает bad dll calling convention
а просто
Код: plaintext
OpalSendMessage L, NewMes
рушит VB вместе с компилятором.
Возникла смутная мысль, что нельзя наверно Message возвращать из API, уж больно сложна она
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
   Example:
      void SendCommand(OpalMessage * command)
      {
        OpalMessage * response;
        if ((response = OpalSendMessage(hOPAL, command)) == NULL) {
          puts("OPAL not initialised.");
        else if (response->m_type != OpalIndCommandError)
          HandleResponse(response);
        else if (response->m_param.m_commandError == NULL || *response->m_param.m_commandError == '\0')
          puts("OPAL error.");
        else
          printf("OPAL error: %s\n", response->m_param.m_commandError);

        FreeMessageFunction(response);
      }
  */
OpalMessage * OPAL_EXPORT OpalSendMessage(OpalHandle opal, const OpalMessage * message);

/** String representation of the OpalSendMessage() which may be used for late
    binding to the library.
 */
typedef OpalMessage * (OPAL_EXPORT *OpalSendMessageFunction)(OpalHandle opal, const OpalMessage * message);

/** Typedef representation of the pointer to the OpalSendMessage() function which
    may be used for late binding to the library.
...
Рейтинг: 0 / 0
Как использовать API если есть исходные коды C++ но нет документации для VB
    #35891420
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что мешает написать клиента на С? На VB свет клином не сошелся.
В крайнем случае сделай ActiveX обертку над своей dll и вызывай ее из VB.
...
Рейтинг: 0 / 0
Как использовать API если есть исходные коды C++ но нет документации для VB
    #35891571
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, ну по идее на C все итак написано, просто есть API хочется понять как они работают. Ну и возможно улучшить приложение в плане интерфейса. Я тут тему подымал про перекидывание файлами. Я исторически пишу на VB, а на C даже форму с двумя кнопками - наверно проблема будет на сутки. Там по идее через эти Massage все управляется стандартно и любое приложение пишется. А писать "обертки" -думаете я знаю как это делается. Хотя бы в референс добавить чтоб с объектами привычно работать- было бы супер, и даже наверно больше сделать и понять смог, потому как чего-то вымучивать на C для меня занятие не из легких. С API понятно тяжело, даже если заработает, по сути любое действие - итти в C-коды пытаться понять и переписывать на VB те команды, что узрею.
...
Рейтинг: 0 / 0
Как использовать API если есть исходные коды C++ но нет документации для VB
    #35891634
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Не, ну по идее на C все итак написано, просто есть API хочется понять как они работают. Ну и возможно улучшить приложение в плане интерфейса. Я тут тему подымал про перекидывание файлами. Я исторически пишу на VB, а на C даже форму с двумя кнопками - наверно проблема будет на сутки. Там по идее через эти Massage все управляется стандартно и любое приложение пишется. Ну и? Сутки потратить на изучение языка, зато потом года два сэкономить на практическом написании программ. Да и GUI на современных C/C++ библиотеках легче писать чем на VB.
Дмитрий77А писать "обертки" -думаете я знаю как это делается.Теперь знаешь:
http://msdn.microsoft.com/en-us/library/aa751972.aspx
...
Рейтинг: 0 / 0
Как использовать API если есть исходные коды C++ но нет документации для VB
    #35891653
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скорее это
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как использовать API если есть исходные коды C++ но нет документации для VB
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]