powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как правильно вызвать функцию 2
25 сообщений из 33, страница 1 из 2
Как правильно вызвать функцию 2
    #39684358
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица экспорта dll
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
File Type: DLL
...
    ordinal hint RVA      name

          2    0 00002E20 ??0ICiFbEncActivator@CI@@QAE@$$QAV01@@Z
          3    1 00002E20 ??0ICiFbEncActivator@CI@@QAE@ABV01@@Z
          4    2 00002A30 ??0ICiFbEncActivator@CI@@QAE@XZ
          5    3 00002E20 ??4ICiFbEncActivator@CI@@QAEAAV01@$$QAV01@@Z
          6    4 00002E20 ??4ICiFbEncActivator@CI@@QAEAAV01@ABV01@@Z
          7    5 000038D0 _createCiFBEncActivator@4
          1    6 000038D0 createCiFBEncActivator


Есть заголовочный файл
Код: 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.
#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 SetKey (const void *pKey, size_t nKeyLen) = 0;
                ...
	};
}

#endif


Есть работающий пример явного подключения dll
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
std::unique_ptr<HINSTANCE__, decltype(&::FreeLibrary)> mHandle(
		::LoadLibraryEx(L"C:\\TESTAPP\\CiFbEnc_x86.dll", 0, LOAD_WITH_ALTERED_SEARCH_PATH),
		&::FreeLibrary);
...
typedef CALL_CONV int(__stdcall *CREATEFUNCPTR)(CI::ICiFbEncActivator**);
CREATEFUNCPTR GetActivator = (CREATEFUNCPTR)::GetProcAddress(mHandle.get(), "createCiFBEncActivator");
...
CI::ICiFbEncActivator* pActivator = NULL;
GetActivator(&pActivator);
...


Как имея ещё lib-файл этой dll сделать неявное подключение и получить pActivator?
(VS 2015)
...
Рейтинг: 0 / 0
Как правильно вызвать функцию 2
    #39684403
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AISКак имея ещё lib-файл этой dll сделать неявное подключение и получить pActivator?

Подключить заголовочный файл. Убрать все строчки кроме последних двух. GetActivator
заменить на createCiFBEncActivator. Добавить библиотеку в список линковки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как правильно вызвать функцию 2
    #39684463
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovПодключить заголовочный файл. Убрать все строчки кроме последних двух. GetActivator
заменить на createCiFBEncActivator. Добавить библиотеку в список линковки.

Вроде так все и сделал:
1. #include "ICiFbEncActivator.h" // было
2. удалил лишнее и оставил последние 2 строчки с изменениями:
Код: plaintext
1.
2.
3.
4.
...
CI::ICiFbEncActivator* pActivator = NULL;
createCiFBEncActivator(&pActivator);
...


3. добавлено #pragma comment(lib,"CiFbEnc_x86.lib")

Но выдает ошибки:
1. identifier "createCiFBEncActivator" is undefined
2. "createCiFBEncActivator" identifier not found

Где делаю неправильно?
...
Рейтинг: 0 / 0
Как правильно вызвать функцию 2
    #39684467
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AISГде делаю неправильно?

Нужен другой заголовочный файл, с объявлением createCiFBEncActivator. На крайний случай ты
можешь сделать его сам. из первых двух строчек.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как правильно вызвать функцию 2
    #39684505
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поскольку в приведенном .h нет декларации функции, то ее надо сделать вручную.
При импорте из DLL при линковке в декларации нужно указывать атрибут dllimport

Что-то типа этого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
#include "ICiFbEncActivator.h"

extern "C" __declspec(dllimport) int __stdcall createCiFBEncActivator(CI::ICiFbEncActivator** ppActivator);
// возможно будет работать и без extern "C"

#pragma comment(lib,"CiFbEnc_x86.lib")
...
CI::ICiFbEncActivator* pActivator = NULL;
createCiFBEncActivator(&pActivator);



Возможно еще придется указать в опциях линкера путь к библиотекам, если правильно помню через 8 лет без VS :)
...
Рейтинг: 0 / 0
Как правильно вызвать функцию 2
    #39684511
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS,

Это же интерфейс, он статической линковки скорее всего не имеет.

Пользуйся, как дают.

В каком нибудь VBA может и выйдет использовать попроще.
...
Рейтинг: 0 / 0
Как правильно вызвать функцию 2
    #39684520
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyПоскольку в приведенном .h нет декларации функции, то ее надо сделать вручную.
При импорте из DLL при линковке в декларации нужно указывать атрибут dllimport

Что-то типа этого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
#include "ICiFbEncActivator.h"

extern "C" __declspec(dllimport) int __stdcall createCiFBEncActivator(CI::ICiFbEncActivator** ppActivator);
// возможно будет работать и без extern "C"

#pragma comment(lib,"CiFbEnc_x86.lib")
...
CI::ICiFbEncActivator* pActivator = NULL;
createCiFBEncActivator(&pActivator);



Возможно еще придется указать в опциях линкера путь к библиотекам, если правильно помню через 8 лет без VS :)
Вот странно в аналогичном примере под Delphi есть декларация этой функции:
Код: pascal
1.
TActivatorFunction = function( out ppEncActivator : ICiFbEncActivator) : Integer; stdcall;


а в варианте под С++ нет. Интересно почему?

Попробовал как Вы предложили, в т.ч. и без extern "C", выдает ошибки:
Error LNK2001 unresolved external symbol __imp__createCiFBEncActivator@4
Error
LNK1120 1 unresolved external

Судя по всему этого мало: #pragma comment(lib,"CiFbEnc_x86.lib")
Где и что надо в настройках указать?
...
Рейтинг: 0 / 0
Как правильно вызвать функцию 2
    #39684521
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglAIS,
...
Пользуйся, как дают.
...
В начале говорил, что явное подключение к dll работает, вопросов нет, но от W7 и выше, а надо чтобы еще и на WinXP. Вот пытаюсь найти решение...
...
Рейтинг: 0 / 0
Как правильно вызвать функцию 2
    #39684528
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS[под Delphi есть декларация этой функции:
Код: pascal
1.
TActivatorFunction = function( out ppEncActivator : ICiFbEncActivator) : Integer; stdcall;


а в варианте под С++ нет. Интересно почему?

Это декларация только описания типа ф-ции
...
Рейтинг: 0 / 0
Как правильно вызвать функцию 2
    #39684532
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AISSiemarglAIS,
...
Пользуйся, как дают.
...
В начале говорил, что явное подключение к dll работает, вопросов нет, но от W7 и выше, а надо чтобы еще и на WinXP. Вот пытаюсь найти решение...
Терминология непонятна "явное подключение" - это что ???

Если работает на 7, но проблемы с ХР попробуй студию пораньше - например 2010-2013.
...
Рейтинг: 0 / 0
Как правильно вызвать функцию 2
    #39684534
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglAISпропущено...

В начале говорил, что явное подключение к dll работает, вопросов нет, но от W7 и выше, а надо чтобы еще и на WinXP. Вот пытаюсь найти решение...
Терминология непонятна "явное подключение" - это что ???

Если работает на 7, но проблемы с ХР попробуй студию пораньше - например 2010-2013.
Явное подключение это типа так .

Т.е. если dll собрана под минимальную версию W7, а проект собрать на старом компиляторе под ХР, который тянет динамически функции из этой dll, то это связка будет работать на ХР? Так что ли?
...
Рейтинг: 0 / 0
Как правильно вызвать функцию 2
    #39684537
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglAIS[под Delphi есть декларация этой функции:
Код: pascal
1.
TActivatorFunction = function( out ppEncActivator : ICiFbEncActivator) : Integer; stdcall;


а в варианте под С++ нет. Интересно почему?

Это декларация только описания типа ф-ции
И как это выглядело бы на с++? и почему этого не было в заголовочном файле для варианта с++?
...
Рейтинг: 0 / 0
Как правильно вызвать функцию 2
    #39684540
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AISПопробовал как Вы предложили, в т.ч. и без extern "C", выдает ошибки:
Error LNK2001 unresolved external symbol __imp__createCiFBEncActivator@4
Error
LNK1120 1 unresolved external
Значит либа CiFbEnc_x86.lib не та или не подхватилась при сборке.
...
Рейтинг: 0 / 0
Как правильно вызвать функцию 2
    #39684542
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AISИ как это выглядело бы на с++? и почему этого не было в заголовочном файле для варианта с++?
Код: plaintext
1.
typedef CALL_CONV int(__stdcall *CREATEFUNCPTR)(CI::ICiFbEncActivator**);
...
Рейтинг: 0 / 0
Как правильно вызвать функцию 2
    #39684608
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AISКак имея ещё lib-файл этой dll сделать неявное подключение и получить pActivator?
(VS 2015) Сильно сомневаюсь, что lib файл позволяет слинковать эту функцию.
...
Рейтинг: 0 / 0
Как правильно вызвать функцию 2
    #39684620
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devСильно сомневаюсь, что lib файл позволяет слинковать эту функцию.проблем то, если кто косой lib предоставил - сделай свой

если функция динимически находится - значит в dll она есть!!!!!!!!!!!!!!!!!
...
Рейтинг: 0 / 0
Как правильно вызвать функцию 2
    #39684622
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)AISИ как это выглядело бы на с++? и почему этого не было в заголовочном файле для варианта с++?
Код: plaintext
1.
typedef CALL_CONV int(__stdcall *CREATEFUNCPTR)(CI::ICiFbEncActivator**);


Хорошо, а чем следующую строчку заменить, если подключается lib, а не dll?
Код: plaintext
1.
CREATEFUNCPTR GetActivator = (CREATEFUNCPTR)::GetProcAddress(mHandle.get(), "createCiFBEncActivator");
...
Рейтинг: 0 / 0
Как правильно вызвать функцию 2
    #39684639
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)rdb_devСильно сомневаюсь, что lib файл позволяет слинковать эту функцию.проблем то, если кто косой lib предоставил - сделай свой

если функция динимически находится - значит в dll она есть!!!!!!!!!!!!!!!!!
lib делал от рабочей dll на VS2015:
1.
dumpbin /exports c:\test\CiFbEnc_x86.dll
File Type: DLL
...
ordinal hint RVA name

2 0 00002E20 ??0ICiFbEncActivator@CI@@QAE@$$QAV01@@Z
3 1 00002E20 ??0ICiFbEncActivator@CI@@QAE@ABV01@@Z
4 2 00002A30 ??0ICiFbEncActivator@CI@@QAE@XZ
5 3 00002E20 ??4ICiFbEncActivator@CI@@QAEAAV01@$$QAV01@@Z
6 4 00002E20 ??4ICiFbEncActivator@CI@@QAEAAV01@ABV01@@Z
7 5 000038D0 _createCiFBEncActivator@4
1 6 000038D0 createCiFBEncActivator

2.
создал CiFbEnc_x86.def
LIBRARY "CiFbEnc_x86.dll"
EXPORTS
??0ICiFbEncActivator@CI@@QAE@$$QAV01@@Z
??0ICiFbEncActivator@CI@@QAE@ABV01@@Z
??0ICiFbEncActivator@CI@@QAE@XZ
??4ICiFbEncActivator@CI@@QAEAAV01@$$QAV01@@Z
??4ICiFbEncActivator@CI@@QAEAAV01@ABV01@@Z
_createCiFBEncActivator@4
createCiFBEncActivator


3.
создал CiFbEnc_x86.lib
lib /def:"c:\test\CiFbEnc_x86.def" /out:"c:\test\CiFbEnc_x86.lib" /machine:x86


Наверное def-файл неправильно создаю или что то не так делаю?
...
Рейтинг: 0 / 0
Как правильно вызвать функцию 2
    #39684647
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сделал для полученного lib-файла:
dumpbin /exports c:\test\CiFbEnc_x86.lib
File Type: LIBRARY

Exports

ordinal name

??0ICiFbEncActivator@CI@@QAE@$$QAV01@@Z (public: __thiscall CI::ICiFbEncActivator::ICiFbEncActivator(class CI::ICiFbEncActivator &&))
??0ICiFbEncActivator@CI@@QAE@ABV01@@Z (public: __thiscall CI::ICiFbEncActivator::ICiFbEncActivator(class CI::ICiFbEncActivator const &))
??0ICiFbEncActivator@CI@@QAE@XZ (public: __thiscall CI::ICiFbEncActivator::ICiFbEncActivator(void))
??4ICiFbEncActivator@CI@@QAEAAV01@$$QAV01@@Z (public: class CI::ICiFbEncActivator & __thiscall CI::ICiFbEncActivator::operator=(class CI::ICiFbEncActivator &&))
??4ICiFbEncActivator@CI@@QAEAAV01@ABV01@@Z (public: class CI::ICiFbEncActivator & __thiscall CI::ICiFbEncActivator::operator=(class CI::ICiFbEncActivator const &))
__createCiFBEncActivator@4
_createCiFBEncActivator

чего то createCiFBEncActivator не наблюдаю :( или так нельзя проверять?
...
Рейтинг: 0 / 0
Как правильно вызвать функцию 2
    #39684655
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS,

сравни экспортируемые функции, например, с помощью плагина для тотала , скорее всего декларации вызова не совпадают
...
Рейтинг: 0 / 0
Как правильно вызвать функцию 2
    #39684666
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AISkealon(Ruslan)пропущено...

Код: plaintext
1.
typedef CALL_CONV int(__stdcall *CREATEFUNCPTR)(CI::ICiFbEncActivator**);


Хорошо, а чем следующую строчку заменить, если подключается lib, а не dll?
Код: plaintext
1.
CREATEFUNCPTR GetActivator = (CREATEFUNCPTR)::GetProcAddress(mHandle.get(), "createCiFBEncActivator");


они не нужны при статическом импорте
достаточно объявить функцию (вообще этот метод в хидере должен быть) выглядеть должен приблизительно вот так
Код: plaintext
1.
__stdcall int createCiFBEncActivator (CI::ICiFbEncActivator** CiFbEncActivator);


собственно, если dll-ку делал с одноимённым методом, то ты его уже объявлял, в итоге из приложения просто вызываешь метод без всяких поисков (LoadLibrary, GetProcAddress)
...
Рейтинг: 0 / 0
Как правильно вызвать функцию 2
    #39684865
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AISSiemarglAIS,
...
Пользуйся, как дают.
...
В начале говорил, что явное подключение к dll работает, вопросов нет, но от W7 и выше, а надо чтобы еще и на WinXP. Вот пытаюсь найти решение...Ну compile-time импорт тут никак не поможет.
...
Рейтинг: 0 / 0
Как правильно вызвать функцию 2
    #39684870
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AISSiemarglпропущено...

Терминология непонятна "явное подключение" - это что ???

Если работает на 7, но проблемы с ХР попробуй студию пораньше - например 2010-2013.
Явное подключение это типа так .

Т.е. если dll собрана под минимальную версию W7, а проект собрать на старом компиляторе под ХР, который тянет динамически функции из этой dll, то это связка будет работать на ХР? Так что ли?Если чужая dll, от которой нет исходников, собрана под минимальную версию W7, то на ХР вы ее не заставите работать никак. Только просить у авторов версию dll под ХР.
...
Рейтинг: 0 / 0
Как правильно вызвать функцию 2
    #39684947
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone,

вполне может быть что она с рантаймом собрана который не установлен


AIS,
посмотри, в том же плагине TC-а хотя бы, все ли нужные функции и либы находит под целевой XP
если бы всё было пучком она скорее всего и при динамической загрузке загрузилась

Если же она использует какие-то отсутствующие на XP функции, то конечно только к создателю
...
Рейтинг: 0 / 0
Как правильно вызвать функцию 2
    #39684948
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneAISпропущено...

Явное подключение это типа так .

Т.е. если dll собрана под минимальную версию W7, а проект собрать на старом компиляторе под ХР, который тянет динамически функции из этой dll, то это связка будет работать на ХР? Так что ли?Если чужая dll, от которой нет исходников, собрана под минимальную версию W7, то на ХР вы ее не заставите работать никак. Только просить у авторов версию dll под ХР.
т.е. решения нет вообще никакого, кроме как искать автора? Или можно чего то там НЕХ-редактором в dll подправить не вдаваясь в код, например "Required OS version 6 .00" чтобы все таки на ХР работало?
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как правильно вызвать функцию 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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