powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как воткнуть в dll свою API "по образу и подобию"?
4 сообщений из 4, страница 1 из 1
Как воткнуть в dll свою API "по образу и подобию"?
    #38314966
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Буду объяснять по идиотски, мне просто надо это сделать.
Есть Opal.dll
Там есть несколько API в файлах c:\opal\src\opal\opal_c.cxx и c:\opal\include\opal.h
Ну т.е. с чего срисовывать есть.
Через эти родные API я Opal прекрасно использую в моей программе на VB6.

Мне нужно решить "нестандартную" задачу.
Надо выполнить в C(++) некий код и вернуть результат в VB6
Почему в C++, потому что в VB6 в силу специфики ничего не получится.

Короче я сделал так для теста:

В файле opal.h накатал
Код: plaintext
1.
2.
3.
int OPAL_EXPORT OpalMyNewApi();
#define OPAL_MYNEWAPI_FUNCTION   "OpalMyNewApi"
typedef int (OPAL_EXPORT *OpalMyNewApiFunction)();

(я подозреваю, что первой строчки для моих целей достаточно)

В файле opal_c.cxx накатал
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
extern "C" {

  int OPAL_EXPORT OpalMyNewApi()
  {
    return 777;
  }

  OpalHandle OPAL_EXPORT OpalInitialise(unsigned * version, const char * options)



В VB6 проекте соответсвенно сваял:
Код: vbnet
1.
2.
3.
4.
Public Declare Function OpalMyNewApi Lib "opal.dll" () As Long
Private Sub Command1_Click()
  MsgBox OpalMyNewApi
End Sub



Скомпилировал все, нажимаю на Command1,
получаю краш vb6 в kernell32

Начал выяснять, заглянул через HEX-вьюер в OPal.dll
Вижу там
Код: plaintext
1.
opal.dll OpalFreeMessage OpalGetMessage OpalInitialise OpalSendMessage OpalShutDown


Т.е. все кроме моей новосозданной. Нет ее в скомпилированной dll

Продолжил выяснять.
Нашел какой-то (у меня VC2005)
c:\opal\src\win32\opal_2005.dtf
в нем вот это
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    OpalFreeMessage @5
    OpalGetMessage @3
    OpalInitialise @1
    OpalSendMessage @4
    OpalShutDown @2
    _OpalFreeMessage@4 @41437 NONAME
    _OpalGetMessage@8 @41438 NONAME
    _OpalInitialise@8 @41439 NONAME
    _OpalSendMessage@8 @41440 NONAME
    _OpalShutDown@4 @41441 NONAME



Взял тупо дописал туда:
OpalFreeMessage @5
OpalGetMessage @3
OpalInitialise @1
OpalSendMessage @4
OpalShutDown @2
>>>OpalMyNewApi @7<<<
_OpalFreeMessage@4 @41437 NONAME
_OpalGetMessage@8 @41438 NONAME
_OpalInitialise@8 @41439 NONAME
_OpalSendMessage@8 @41440 NONAME
_OpalShutDown@4 @41441 NONAME
_OpalMyNewApi@4 @41442 NONAME

После неких игр со случайными циферками 6-7-8 /41442... (чего-то он переписал сам), компилятор C++ ругаться перестал и внутри dll (через HEX) я увидел название своей ф-ции
а VB6 вернул мне ответ Msgbox: 777

Но после пары строчек кода в C++ и пары компиляций все опять сбилось и моя "API" в dll не добавляется.

Я в этой технике ни хрена не понимаю, мне в данном случае просто надо сделать этот механизм возврата результата через свою API.
Скорее всего что-то надо добавить еще в код, вряд ли opal_2005.dtf пишется ручками.
Только я не знаю ГДЕ и ЧЕГО. Анализ "образа и подобия" -те 5 API что есть вроде как ничего по делу больше не дает.
Вполне возможно что еще какие-то инструкции компилятору где-то прописаны, где это может быть?

Подскажет кто в чем загвозка?

P.S. Могу конечно чиркануть письмо автору Opal, думаю ответит. Но как то стыдно лезть к нему с этим вопросом.
...
Рейтинг: 0 / 0
Как воткнуть в dll свою API "по образу и подобию"?
    #38314968
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения
Код: plaintext
1.
2.
3.
#ifdef _WIN32
  #define OPAL_EXPORT __stdcall
#else



Т.е. следует читать как
Код: plaintext
1.
int __stdcall OpalMyNewApi();



Думаю это существенное уточнение.
...
Рейтинг: 0 / 0
Как воткнуть в dll свою API "по образу и подобию"?
    #38319793
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Opal.def

Код: plaintext
1.
2.
3.
4.
5.
LIBRARY      "Opal"

EXPORTS
OpalMyNewApi           @1
OpalMyNewApi2          @2



Opal.h

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
#ifdef __cplusplus
extern "C" {
#endif
__int32 __declspec(dllexport) __stdcall OpalMyNewApi();
__int32 __declspec(dllexport) __stdcall OpalMyNewApi2();

#ifdef __cplusplus
}
#endif




opal.cpp

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
__int32 __stdcall OpalMyNewApi()
{
    return 0;
}

__int32 __stdcall OpalMyNewApi2()
{
    return 0;
}
...
Рейтинг: 0 / 0
Как воткнуть в dll свою API "по образу и подобию"?
    #38330012
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lepsik,

Спасибо.
Да разобрался уже с .def.
Но во первых она почему-то мне не вытаскивала то что я хотел.
А во вторых чем делать такое извращение, проще написать свою dll что и было сделано:
Как мне написать API-ф-цию чтоб возвращала строку.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как воткнуть в dll свою API "по образу и подобию"?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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