Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
3 / 3 / 2
Регистрация: 11.03.2014
Сообщений: 15
1

C++ DLL и WinAPI

11.03.2014, 21:00. Показов 3390. Ответов 31
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
У меня есть приложение с заголовочным файлом, в котором описаны два класса, используемые в программе. Как мне создать dl-ку и использовать её в проекте?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.03.2014, 21:00
Ответы с готовыми решениями:

Программа на WinApi требует Msvcr*.dll
Объясните пожалуйста почему программа написанная на WinApi требует различные Msvcr*.dll? P.S....

Вызов функции из DLL, показывающей DialogBox - WinAPI
1. Есть написанная вручную DLL, где есть находится функция вызова диалога. Я её динамически...

Подскажите, как вызвать в основном файле функцию из .dll, используя функции WinAPI
Привет всем. Подскажите, пожалуйста, как вызвать функцию, определение которой находится в...

Использование WinAPI в C#. Библиотека "User32.dll"
Функции GetWindowRect и GetClientRect дают результати показание на рисунке ниже, а мено нужно...

31
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
12.03.2014, 17:29 21
Author24 — интернет-сервис помощи студентам
C++
1
2
virtual bool ADDIN_API Init(void*);
    virtual bool ADDIN_API setMemManager(void* mem);
Безпонт, не динамично нифига.

Я хочу функцию, при обращении к которой выводилось бы кол-во аргументов и их тип.(+возвр. знач)

Ну полной динамики врят ли можно добиться таким путём, только через блок схему алгоритмов файлов, но это конешно настолько из*п, что реализация будет затрачивать 100% цпу мозга, который в конечном итоге расплавится)))

Можешь все данные о функциях вытаскивать заранее известными функциями
Я имею ввиду, ну допустим я реализую функцию GetAtributs, после обращения к этой функции получу кол-во аргументов и типы. А далее по этим данным уже хотелось бы вызвать саму функцию, только динамически! Т.е. это:
C++
1
typedef  BOOL (WINAPI MESS)(UINT);
Или что там определяет аргументы(я ещё не вкурил) и саму функцию - сделать реально прямо динамически.(тут я только предполагаю через свой ядерный велосипед реализацию, а по другому - даже не представляю)...
0
Заблокирован
12.03.2014, 17:44 22
Цитата Сообщение от Izual Посмотреть сообщение
Я имею ввиду, ну допустим я реализую функцию GetAtributs, после обращения к этой функции получу кол-во аргументов и типы. А далее по этим данным уже хотелось бы вызвать саму функцию, только динамически!
Ты имеешь ввиду, без написания тайпдефа ...
Ну ты можешь сделать что - то вроде InputLayout-ов в DirectX11 :-)))))) Где создаётся описатель данных в вертекс буффере ... ладно, проехали :-))))

Можешь сделать функцию общего типа, точнее несколько функций, которые будут различаться кол-вом параметров, например:
C++
1
2
3
VARIANT Function();
VARIANT Function(VARINAT p1);
VARIANT Function(VARINAT p1, VARINAT p1);
где VARIANT - это любой известный тебе тип и зависимости от того, сколько атрибутов и какого они типы - вызываешь как бы нужную функцию...
C++
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
struct tagVARIANT
    {
    union 
        {
        struct __tagVARIANT
            {
            VARTYPE vt;
            WORD wReserved1;
            WORD wReserved2;
            WORD wReserved3;
            union 
                {
                LONGLONG llVal;
                LONG lVal;
                BYTE bVal;
                SHORT iVal;
                FLOAT fltVal;
                DOUBLE dblVal;
                VARIANT_BOOL boolVal;
                _VARIANT_BOOL bool;
                SCODE scode;
                CY cyVal;
                DATE date;
                BSTR bstrVal;
                IUnknown *punkVal;
                IDispatch *pdispVal;
                SAFEARRAY *parray;
                BYTE *pbVal;
                SHORT *piVal;
                LONG *plVal;
                LONGLONG *pllVal;
                FLOAT *pfltVal;
                DOUBLE *pdblVal;
                VARIANT_BOOL *pboolVal;
                _VARIANT_BOOL *pbool;
                SCODE *pscode;
                CY *pcyVal;
                DATE *pdate;
                BSTR *pbstrVal;
                IUnknown **ppunkVal;
                IDispatch **ppdispVal;
                SAFEARRAY **pparray;
                VARIANT *pvarVal;
                PVOID byref;
                CHAR cVal;
                USHORT uiVal;
                ULONG ulVal;
                ULONGLONG ullVal;
                INT intVal;
                UINT uintVal;
                DECIMAL *pdecVal;
                CHAR *pcVal;
                USHORT *puiVal;
                ULONG *pulVal;
                ULONGLONG *pullVal;
                INT *pintVal;
                UINT *puintVal;
                struct __tagBRECORD
                    {
                    PVOID pvRecord;
                    IRecordInfo *pRecInfo;
                    }   __VARIANT_NAME_4;
                }   __VARIANT_NAME_3;
            }   __VARIANT_NAME_2;
        DECIMAL decVal;
        }   __VARIANT_NAME_1;
    } ;
typedef VARIANT *LPVARIANT;
 
typedef VARIANT VARIANTARG;
 
typedef VARIANT *LPVARIANTARG;
или вообще через Func(...) и va_list ap;

В общем для того что ты хочешь - тебе надо добропожаловать в ассемблер
Где ты вручную будешь нужно кол-во параметров пушить в стек и сам их возвращать ...
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
12.03.2014, 18:05 23
Цитата Сообщение от THE--MASTER Посмотреть сообщение
точнее несколько функций
Нет. Это не динамика.

Цитата Сообщение от THE--MASTER Посмотреть сообщение
где VARIANT
В раздел выше "С++", уже есть тема, про union. Я таки пришёл к тому что VARIANT не даст мне всех нужных типов(например HWND, FILE, DWORD...), а привидение типов - не сделать динамически(на сколько я понимаю). Потому придётся делать собственный VARIANT, и реализовывать типы через enum... Тут единственное что, так я понимаю что если я делаю всё через один cpp файл(как например в теме "окна без файла ресурсов", ну думаю видел тему), то я тупо в глобальных всё это объявлю, а вот если DLL, то прокатит ли? =)
Цитата Сообщение от THE--MASTER Посмотреть сообщение
через Func(...) и va_list ap
what is that? Я видел "переменно кол-во аргументов", которое троеточием прописывается(ну точнее я использую для Excel Ole такую функцию), но как оно там работает - как то стрёмно разбираться, выглядит так, как будто может возникнуть ошибка, а в этом случае - нафига мне всё это, если есть эта 1С программа с кучей багов, я дублировать баг программы не хочу, надо всё по уму сделать и просто=)
Цитата Сообщение от THE--MASTER Посмотреть сообщение
надо добропожаловать в ассемблер
нене, изврат не предлогать, я поэтому и классов сторонюсь, что там точно так же "чёрт голову сломает".
На самом деле, я вот думаю... если я одним cpp файлом всё буду реализовывать, то мне аргументы вообще по барабану будут, т.к. они будут "почти глобальными", т.е. я их когда надо создам, когда надо - удалю, с этим проблем через cpp файл не будет.(но будут проблемы с итоговым размером файла этого, если уж сейчас 15000 строк кода, то что будет после)
В общем, попробую выпить яду, может поможет)))
0
Заблокирован
12.03.2014, 18:23 24
Цитата Сообщение от Izual Посмотреть сообщение
В общем, попробую выпить яду, может поможет)))
это выход!
Лучше делай функцию, которая имеет один лишь аргумент - строку и возвращает тоже строку, а уж эту строк ты сможешь парсить как захочешь ...
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
12.03.2014, 18:38 25
Цитата Сообщение от THE--MASTER Посмотреть сообщение
один лишь аргумент - строку
Да, только что об этом подумал... В принципе это поможет, а исходя из типов аргументов уже конвертировать назад и вперёд.
Так, тогда функция будет выглядеть не так:
C++
1
typedef  BOOL (WINAPI MESS)(UINT);
А так? :
C++
1
typedef  STRING (WINAPI MESS)(STRING);
Или не стринг, а *char?
0
Заблокирован
12.03.2014, 20:56 26
Цитата Сообщение от Izual Посмотреть сообщение
STRING
а что за тип данных такой STRING ?
передаваться в функцию и возвращаться должны конечно же указатели на NULL терминейтед стринги, char* или wchar_t*.
Тут правда Убеждённый как - то говорил, что аллокатор new не подойдёт для передачи данных из DLL в софт, по этому лично я рекомендую использовать SysAllocateString для аллокации памяти под строку типа BSTR (wchar_t*) и соответственно SysFreeString для её освобождения...

Добавлено через 55 секунд
Цитата Сообщение от Izual Посмотреть сообщение
typedef *STRING (WINAPI MESS)(STRING);
typedef *BSTR (WINAPI MESS)(BSTR )
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
12.03.2014, 21:12 27
Цитата Сообщение от THE--MASTER Посмотреть сообщение
аллокатор new не подойдёт для передачи данных из DLL в софт
Не понял... Поясни пожалуйста.
New, это же оператор(ну или как ты сказал "аллокатор") который "создаёт" переменную(образно), т.е. если у меня структура, экземпляр которой создаётся с помощью New, то как я его обойду? Что то я совсем не догнал.
0
Заблокирован
12.03.2014, 21:20 28
Цитата Сообщение от Izual Посмотреть сообщение
Не понял... Поясни пожалуйста.
New, это же оператор(ну или как ты сказал "аллокатор") который "создаёт" переменную(образно)
нде... Рано тебе ещё на ветке WinApi сидеть, ролбэкайся на С++ для начинающих
Allocate = выделять, это оператор выделения памяти, тоесть аллокатор.
ОН ничего не создаёт, он выделает память заданного объёма, правда кое с какими хитростями (там можно узнать тип и размер выделенной памяти...)
Цитата Сообщение от Izual Посмотреть сообщение
т.е. если у меня структура, экземпляр которой создаётся с помощью New, то как я его обойду? Что то я совсем не догнал.
Причём тут структура? Я тебе говорил про твои строки, которые будешь кидать в DLL и обратно. Внутри DLL или внутри софта можешь делать что хочешь, а вот для передачи, например, в DLL строки - сначала выделаешь под неё память SysFreeString - гом, после того, как закончишь в ней работать в DLL, освобождаешь в DLL, выделенную в основной программе под неё память посредствам SysFreeString (в DLL вызываешь в данном примере).
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
12.03.2014, 21:35 29
Цитата Сообщение от THE--MASTER Посмотреть сообщение
ОН ничего не создаёт
Я же сказал "образно".

Цитата Сообщение от THE--MASTER Посмотреть сообщение
Причём тут структура?
А причём тут New тогда?..
Цитата Сообщение от THE--MASTER Посмотреть сообщение
аллокатор new не подойдёт для передачи данных из DLL в софт
Имеется же ввиду, что если я с помощью New выделяю память для переменной ( ну образно - создаю переменную ), то это будет не правильно, вы же об этом написали?..
А я кидаю именно переменные, которые с помощью New созданы, т.е. из структуры с вложенным union.
0
Заблокирован
12.03.2014, 21:48 30
Цитата Сообщение от Izual Посмотреть сообщение
Имеется же ввиду, что если я с помощью New выделяю память для переменной ( ну образно - создаю переменную ), то это будет не правильно, вы же об этом написали?..
Я написал, что:
Цитата Сообщение от Убежденный Посмотреть сообщение
- У new/delete ограничения на передачу памяти между модулями (exe <---> dll);
За подробностями - к нему.
Цитата Сообщение от Izual Посмотреть сообщение
А я кидаю именно переменные, которые с помощью New созданы, т.е. из структуры с вложенным union.
Какие переменные? Мы ж с тобой уже договорились, что твоя функция будет принимать и возвращат чисто строки
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
12.03.2014, 22:03 31
Цитата Сообщение от THE--MASTER Посмотреть сообщение
твоя функция будет принимать и возвращат чисто строки
Принимает строки, чем и как созданные? У меня полная динамика, я строки с помощью union in structure "создаю", а не обычным методом типа: char buf[500];
Цитата Сообщение от THE--MASTER Посмотреть сообщение
Я написал, что:
Первое, это не вы написали, а Убеждённый. Второе - про ограничения не было и слова, а это ключевой момент в понимании "почему нельзя", я же не солдат, которому сказали - он сделал, без вопросов... Мы программисты народ творческий(может не все, или не все могут назваться программистами).
0
Заблокирован
12.03.2014, 22:12 32
Цитата Сообщение от Izual Посмотреть сообщение
У меня полная динамика, я строки с помощью union in structure "создаю", а не обычным методом типа: char buf[500];

Ты уже хлебнул что ли? Что ты городишь? SysAllocateString используй, сто раз что ли говорить надо?

Добавлено через 1 минуту
Цитата Сообщение от Izual Посмотреть сообщение
Первое, это не вы написали, а Убеждённый. Второе - про ограничения не было и слова,
Ты читать не умеешь?
Цитата Сообщение от THE--MASTER Посмотреть сообщение
Тут правда Убеждённый как - то говорил, что аллокатор new не подойдёт для передачи данных из DLL в софт, по этому лично я рекомендую использовать SysAllocateString для аллокации памяти под строку типа BSTR (wchar_t*) и соответственно SysFreeString для её освобождения...
0
12.03.2014, 22:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.03.2014, 22:12
Помогаю со студенческими работами здесь

Ошибка об отсутствии MSVCP140D.dll, ucrtbased.dll, CONCRT140D.dll, VCRUNTIME140D.dll
Добрый день, товарищи. Возникла проблема. Делаю программу с использованием openCV 3.1 на Visual...

Кто может поделиться файлами ogg.dll, vorbis.dll и vorbisfile.dll - 32-х и 64-битными версиями?
Движок перевожу на платформу Win64 и нужно, чтобы разрядность ЕХЕ и DLL совпадали, а в интернете...

Затупил, скажите где взять libmysqld.dll, libmysqld50.dll, libmysqld51.dll
Вечер добрый, ставлю ZEOS на Delphi 7, и для нормальной работы нужны файлы libmysqld.dll,...

Сборка Qt: отучение Qt от mingw10.dll, libgcc_s_dw2-1.dll и других Qt***.dll
В связи с тем, что часто возникают одни и те же вопросы, а в нете копаться никто не любит привожу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru