Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как правильно вызвать функцию 2 / 25 сообщений из 33, страница 1 из 2
07.08.2018, 16:15
    #39684358
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно вызвать функцию 2
Есть таблица экспорта 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
07.08.2018, 17:18
    #39684403
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно вызвать функцию 2
AISКак имея ещё lib-файл этой dll сделать неявное подключение и получить pActivator?

Подключить заголовочный файл. Убрать все строчки кроме последних двух. GetActivator
заменить на createCiFBEncActivator. Добавить библиотеку в список линковки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
07.08.2018, 18:59
    #39684463
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно вызвать функцию 2
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
07.08.2018, 19:06
    #39684467
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно вызвать функцию 2
AISГде делаю неправильно?

Нужен другой заголовочный файл, с объявлением createCiFBEncActivator. На крайний случай ты
можешь сделать его сам. из первых двух строчек.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
07.08.2018, 20:59
    #39684505
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно вызвать функцию 2
Поскольку в приведенном .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
07.08.2018, 21:12
    #39684511
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно вызвать функцию 2
AIS,

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

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

В каком нибудь VBA может и выйдет использовать попроще.
...
Рейтинг: 0 / 0
07.08.2018, 22:32
    #39684520
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно вызвать функцию 2
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
07.08.2018, 22:37
    #39684521
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно вызвать функцию 2
SiemarglAIS,
...
Пользуйся, как дают.
...
В начале говорил, что явное подключение к dll работает, вопросов нет, но от W7 и выше, а надо чтобы еще и на WinXP. Вот пытаюсь найти решение...
...
Рейтинг: 0 / 0
07.08.2018, 23:09
    #39684528
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно вызвать функцию 2
AIS[под Delphi есть декларация этой функции:
Код: pascal
1.
TActivatorFunction = function( out ppEncActivator : ICiFbEncActivator) : Integer; stdcall;


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

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

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

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

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

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


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

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

если функция динимически находится - значит в dll она есть!!!!!!!!!!!!!!!!!
...
Рейтинг: 0 / 0
08.08.2018, 09:55
    #39684622
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно вызвать функцию 2
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
08.08.2018, 10:20
    #39684639
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно вызвать функцию 2
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
08.08.2018, 10:29
    #39684647
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно вызвать функцию 2
сделал для полученного 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
08.08.2018, 10:37
    #39684655
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно вызвать функцию 2
AIS,

сравни экспортируемые функции, например, с помощью плагина для тотала , скорее всего декларации вызова не совпадают
...
Рейтинг: 0 / 0
08.08.2018, 10:47
    #39684666
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно вызвать функцию 2
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
08.08.2018, 15:06
    #39684865
Barlone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно вызвать функцию 2
AISSiemarglAIS,
...
Пользуйся, как дают.
...
В начале говорил, что явное подключение к dll работает, вопросов нет, но от W7 и выше, а надо чтобы еще и на WinXP. Вот пытаюсь найти решение...Ну compile-time импорт тут никак не поможет.
...
Рейтинг: 0 / 0
08.08.2018, 15:11
    #39684870
Barlone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно вызвать функцию 2
AISSiemarglпропущено...

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

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

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

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


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

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

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

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


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