powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как правильно вызвать функцию
8 сообщений из 8, страница 1 из 1
Как правильно вызвать функцию
    #39597976
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть DLL.
исходник на С++
Код: 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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
#ifndef _ICiFbEncActivator_H_
#define _ICiFbEncActivator_H_

#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32__)) && !defined(__MINGW32__)
	#define CALL_CONV   __stdcall
	#define CI_LIB_EXP __declspec(dllexport)
	#define NO_VTBL __declspec(novtable)
#else
	#define CALL_CONV
	#define CI_LIB_EXP
	#define NO_VTBL
#endif

#define CI_LIB_API extern "C" CI_LIB_EXP

enum CIErrors
{
	Err_OK = 0,
	Err_IncorrectCall = -1,
	Err_IncorrectSize = -2,
	Err_CantAllocMemory = -3,
	Err_AlreadyInSameState = -4,
	Err_FirebirdState = -5,
	Err_IncorrectParam = -6,
	Err_NullPointer = -7
};

namespace CI {
#pragma pack(push,1)
	struct DBEncInf
	{
		size_t PageSize;
		size_t PagesCount;
		size_t ProcessedPage;
		bool isEncrypted;
		bool inProcess;
	};
#pragma pack(pop)
	class CI_LIB_EXP NO_VTBL ICiFbEncActivator
	{
	public:
		... /* как вызвать эту функцию и получить структуру с результатом выполнения?*/
		virtual int32_t CALL_CONV GetState(DBEncInf& inf) = 0;
                ...
	};
}

#endif


Как правильно вызвать функцию (GetState) и получить структуру с результатом выполнения?
...
Рейтинг: 0 / 0
Как правильно вызвать функцию
    #39598144
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS, всё очевидно! Сначала нужно получить из DLL указатель или ссылку на экземпляр класса, наследующего интерфейсный класс ICiFbEncActivator (DLL должна экспортировать соответствующую функцию, например: ICiFbEncActivator * CI_LIB_EXP getFbEncActivator(void)), а затем вызвать его виртуальный метод, передав в него свой экземпляр структуры DBEncInf.
Как-то так:
Код: plaintext
1.
2.
3.
DBEncInf my;
ICiFbEncActivator * instFbEncActivator = getFbEncActivator(void);
int32_t ret = instFbEncActivator->GetState(DBEncInf& my);
...
Рейтинг: 0 / 0
Как правильно вызвать функцию
    #39598148
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev, пардон, скопипастил криво. Вызов виртуального метода в последней строке просто:
Код: plaintext
1.
int32_t ret = instFbEncActivator->GetState(my);
...
Рейтинг: 0 / 0
Как правильно вызвать функцию
    #39598157
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev, и экспортируемая функция похожа, скорее, на:
Код: plaintext
1.
ICiFbEncActivator * CALL_CONV getFbEncActivator(void)


где CALL_CONV - макроопределение для библиотечного соглашения вызова (__stdcall или __cdecl).
...
Рейтинг: 0 / 0
Как правильно вызвать функцию
    #39598193
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,
собственно я так практически и делал, но выдает ошибку (-1) //Err_IncorrectCall

ПС. в исходнике есть и другие функции этого класса, вызываю их аналогично, то они все работают, а эта нет. Правда только в этой функции есть параметр - структура, а в других нет.
...
Рейтинг: 0 / 0
Как правильно вызвать функцию
    #39598244
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS, подозреваю, что метод вызывается с другими параметрами.
https://habrahabr.ru/post/331002/
...
Рейтинг: 0 / 0
Как правильно вызвать функцию
    #39598248
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS, полагаю, с вопросами по вызовам функций API клиента FirebirdSQL лучше обращаться в этот форум.
...
Рейтинг: 0 / 0
Как правильно вызвать функцию
    #39598601
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devAIS, подозреваю, что метод вызывается с другими параметрами.
https://habrahabr.ru/post/331002/
Да нет, все как в источнике
rdb_devAIS, полагаю, с вопросами по вызовам функций API клиента FirebirdSQL лучше обращаться в этот форум.
Возможно Вы и правы, хотя мне казалось, что проблема связана с ошибкой вызова на С++, а не с Firebird.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как правильно вызвать функцию
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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