Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 13.12.2017
Сообщений: 3

Отредактировать программу exe, чтобы можно было использовать как dll

13.12.2017, 18:41. Показов 1890. Ответов 4

Студворк — интернет-сервис помощи студентам
Есть проект на C++, который отображает спектрограмму звука на системном микшере (грубо говоря выход на колонки).

Я хотел изменить его, чтобы можно было использовать как dll, вкратце программа работает так: открывает устройство записи звука по-умолчанию функцией waveInOpen, а затем через callback вызывается с++ функция Process которая заполняет массив fft значениями и выводит на экран (но вывод, конечно, в библиотеке мне не нужен).
Массив я сам передам, я не пойму как запустить саму библиотеку, ведь при импорте в другом приложении, как я понял она сама не запускается, надо сделать какую-то функцию инициализации, по типу main, которая запустит процесс, а уже потом можно будет считывать массив, например по таймеру.

Я набросал проект в Visual Studio 2017 (приложен), там две функции экспортируются _Initialize и GetFFT, пока процесс преобразования не запущен GetFFT возвращает 5, а если запустится, то будет 10, мне этого достаточно, чтобы двигаться дальше.
Я бы хотел, кто разбирается, помочь мне заполнить пустую функцию _Initialize по типу уже написанной CWaveInFFTApp::InitInstance() от exe приложения (она закомментирована, чтобы dll нормально компилировалась), чтобы процесс преобразования запустился и callback функция Process начала вызываться по мере наполнения буфера (несколько раз в секунду). Конечно все окна, диалоги, вывод графиков можно смело удалять.

Заранее всем огромное спасибо!

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
__declspec(dllexport) void _Initialize()
{
    // ???????
 
 
}
 
 
BOOL CWaveInFFTApp::InitInstance()
{
    AfxEnableControlContainer();
 
    // Standard initialization
    // If you are not using these features and wish to reduce the size
    //  of your final executable, you should remove from the following
    //  the specific initialization routines you do not need.
 
#ifdef _AFXDLL
    //Enable3dControls();           // Call this when using MFC in a shared DLL
#else
    Enable3dControlsStatic();   // Call this when linking to MFC statically
#endif
 
    CWaveInFFTDlg dlg;
    m_pMainWnd = &dlg;
    int nResponse = dlg.DoModal();
    if (nResponse == IDOK)
    {
        // TODO: Place code here to handle when the dialog is
        //  dismissed with OK
    }
    else if (nResponse == IDCANCEL)
    {
        // TODO: Place code here to handle when the dialog is
        //  dismissed with Cancel
    }
 
    // Since the dialog has been closed, return FALSE so that we exit the
    //  application, rather than start the application's message pump.
    return FALSE;
}
Вложения
Тип файла: zip waveInFFT.zip (434.4 Кб, 4 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.12.2017, 18:41
Ответы с готовыми решениями:

Как создать программу в С++, чтобы его можно было запускать как исполняемый .exe файл?
Здравствуйте! Собственно вся суть сабжа содержится содержится в сабже :) допустим: // ConsoleApplication3.cpp: определяет точку...

Как использовать куки, чтобы потом было можно их использовать в запросах
Скажите полажуйста! как добавить ! куки , чтобы потом было можно использовать в запросах! тоесть public string Get(string url,...

Можно ли упаковать в exe'шник используемые в проекте библиотеки так, чтобы можно было запустить программу на машине без .NET
Я погуглил, но нашел только очень дорогие программы. А хотелось бы узнать насчет предложенного мной способа)

4
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
13.12.2017, 19:31
Цитата Сообщение от Jatixo Посмотреть сообщение
Массив я сам передам, я не пойму как запустить саму библиотеку, ведь при импорте в другом приложении, как я понял она сама не запускается, надо сделать какую-то функцию инициализации, по типу main, которая запустит процесс, а уже потом можно будет считывать массив, например по таймеру.
Называется DLLMain.
0
0 / 0 / 0
Регистрация: 13.12.2017
Сообщений: 3
13.12.2017, 19:44  [ТС]
Пишет DllMain уже определен в файле .obj, а этот файл не текстовый. Что-то я совсем запутался, так-то та функция CWaveInFFTApp::InitInstance() от exe видимо запускается как DllMain, поэтому и после её закомментирования начинает работать импорт dll в другом приложении. Возможно нужно просто что-то в ней поменять, чтобы запустилось всё нормально. Но никаких ошибок толком ничего, просто когда она есть, то после вызова какой-нибудь экспортируемой функции в приложении пишет "Не удается загрузить DLL "waveInFFT.dll": Произошел сбой в программе инициализации библиотеки динамической компоновки (DLL)." А когда её нет, то функция вызывается, возвращает 5, всё ок, но на 10 не переходит, то есть сам процесс захвата звука не начинается...
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
13.12.2017, 19:56
Цитата Сообщение от Jatixo Посмотреть сообщение
Пишет DllMain уже определен в файле .obj, а этот файл не текстовый.
Ну, если ваш фреймворк уже воткнул свою версию DLLMain, можно попробовать вызвать функцию инициализации ручками.
1) Вызываете в основной программе LoadLibrary.
2) Вызываете auto init=GetProcAddress(dllHandle,"_Initiali ze").
3) Вызываете (*init)();

Добавлено через 4 минуты
Цитата Сообщение от Jatixo Посмотреть сообщение
"Не удается загрузить DLL "waveInFFT.dll": Произошел сбой в программе инициализации библиотеки динамической компоновки (DLL)."
UPD А, стоп, у вас там ветки if пустые. Не в курсе от какого это фреймворка, но попробуйте туда вместо if return TRUE воткнуть.
0
0 / 0 / 0
Регистрация: 13.12.2017
Сообщений: 3
15.12.2017, 14:26  [ТС]
Я пробовал менять в конце функции return FALSE на return TRUE, не запускается инициализация и ошибок нет, то есть GetFFT возвращает 5. Попробовал сейчас if заменить на return TRUE, тоже самое...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.12.2017, 14:26
Помогаю со студенческими работами здесь

Как можно определить переменную в файле configure.in,чтобы её можно было использовать в Makefile?
Ситуация такая - В проекте конфигуратор программы используется только для проверок на наличие программ/библиотек,Automake не...

Как сделать, чтобы можно было использовать графический редактор WindowsForm?
Как сделать, чтобы можно было использовать графический редактор WindowsForm? Пишу на С++. В примерах пишут: "Нажмите “Файл” →...

Как создать DLL на С++, чтобы его можно было подключить к VBA?
Нужно, чтобы можно было создавать в VBA объекты классов, которые описаны в C++. Как подключить к VBA библиотеку с функциями,...

Можно ли как-то сделать так, чтобы dll не было в папке с программой?
Можно ли как-то сделать так, чтобы dll не было в папке с программой? То есть загрузить их в проект и подключить оттуда. Чтобы когда...

Как правильно сохранить данные в таблицы, чтобы их сразу же можно было использовать?
Вообщем есть 2 таблицы, который созданы в локальной БД c#. Я открываю exe файл программы и в эти две таблицы спокойно заношу данные и потом...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru