Форум программистов, компьютерный форум, киберфорум
Наши страницы
Инсталляторы
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
Avazart
Эксперт С++
7934 / 5754 / 570
Регистрация: 10.12.2010
Сообщений: 26,402
Записей в блоге: 17
1

InnoSetup Access Violation при вызове ф-ции из dll c wchart* параметрами

05.10.2018, 14:51. Просмотров 528. Ответов 6

Версия InnoSetup 5.6.1 u

Есть DLL собранная на C/C++ в MSVC2015.

test.h
C++
1
2
3
4
5
6
7
8
9
10
#ifdef TEST_LIBRARY
  #define TEST_EXPORT extern "C" __declspec(dllexport)
#else
  #define TEST_EXPORT extern "C" __declspec(dllimport)
#endif
 
 
TEST_EXPORT  void test(wchar_t *app_name,
                        wchar_t *cmd_line,
                        wchar_t *current_dir);
test.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "test.h"
#include <string>
 
void test(wchar_t *app_name,
          wchar_t *cmd_line,
          wchar_t *current_dir)
{
  // используем параметры
  std::wstring str1(app_name);
  std::wstring str2(cmd_line);
  std::wstring str3(current_dir);
  // еще что-то делаем ... это не важно
}

Ino-скрипт

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[Files]
Source: "build-test-Desktop_Qt_5_9_1_MSVC2015_32bit-Release/release/test.dll"; 
   Flags: dontcopy solidbreak
 
[Code]
 
procedure test(const app_name:String;
               const cmd_line:String;
               const current_dir:String);
  external 'test@files:test.dll cdecl delayload';
 
var
  OutputMemo: TMemo;
  RunButton: TButton;
 
////////////////////////////////////////////
procedure RunButtonOnClick(Sender: TObject);
var
  AppName,CmdLine,CurrentDir:String;
begin
  test(AppName,CmdLine,CurrentDir);
end;

При вызове ф-ции возникает Access Violation (нажатию на кнопка "Run").

Полный тестовый проект со всем необходимым прикрепляю в архиве.
0
Вложения
Тип файла: zip test.zip (3.40 Мб, 1 просмотров)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.10.2018, 14:51
Ответы с готовыми решениями:

Access Violation при вызове функции из DLL
Доброго времени. У меня загвоздочка с вызовом одной функции из длл (описание функции лежит в док...

Access violation при вызове конструктора
Здравствуйте! У меня при вызове конструктора возникает ошибка. Access violation at adress...

Access violation при вызове mysql_errno
День добрый!!! Столкнулся с проблемой при вызове функции mysql_errno(). #include &lt;vcl.h&gt;...

Access violation при повторном вызове компонента
Lazarus IDE v1.0.12 fpc 2.6.2 Ubuntu 13.10 i386 Создал визуальный компонент на основе TTreeView...

Access Violation при вызове метода Open для Sqlquery из потока
Здравствуйте, очень нужна помощь. Использую dbexpress для работы с Oracle. В проекте есть модуль...

6
Avazart
Эксперт С++
7934 / 5754 / 570
Регистрация: 10.12.2010
Сообщений: 26,402
Записей в блоге: 17
05.10.2018, 16:27  [ТС] 2
В общем ошибка была глупая: передаваемые пустые строки, необходима проверка:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//---------------------------------------------------------------------------------
template <typename CharT>
inline std::basic_string<CharT> make_std_string(const CharT * c_string)
{
  return c_string? c_string: std::basic_string<CharT>();
}
//---------------------------------------------------------------------------------
#include "test.h"
#include <string>
 
void test(wchar_t *app_name,
          wchar_t *cmd_line,
          wchar_t *current_dir)
{
  // используем параметры
  std::wstring appName=  make_std_string(app_name);
  std::wstring cmdLine=    make_std_string(cmd_line);
  std::wstring currentDir = make_std_string(current_dir);
  // еще что-то делаем ... это не важно
}
//---------------------------------------------------------------------------------
0
v_svitere
697 / 408 / 134
Регистрация: 03.06.2009
Сообщений: 1,190
Записей в блоге: 4
08.10.2018, 14:19 3
Avazart,
Спасибо, вам за инфорацию, про использование библиотек в INNO SETUP.
Я же правильно понимаю, что библиотеки классов С# тоже можно использовать?
0
Avazart
Эксперт С++
7934 / 5754 / 570
Регистрация: 10.12.2010
Сообщений: 26,402
Записей в блоге: 17
08.10.2018, 14:26  [ТС] 4
Цитата Сообщение от v_svitere Посмотреть сообщение
Я же правильно понимаю, что библиотеки классов С# тоже можно использовать?
Судя по документации - да.
Но я не вижу смысла, вижу только потенциальные проблемы например что, если версия NET на компе будет ниже установленной в системе?

Добавлено через 2 минуты

Не по теме:

v_svitere, Кстати проект которые я делал - тот самый запуск консоли и перенаправление в/в, на данный момент реализовано так: https://github.com/Avazart/bicycle_process_dll

0
v_svitere
697 / 408 / 134
Регистрация: 03.06.2009
Сообщений: 1,190
Записей в блоге: 4
08.10.2018, 14:35 5
Avazart, Я, к сожалению, не смогу его адекватно оценить, т.к. уровень знаний С++ и delphi практически нулевой.
Я немного кодил на с#, и изучал NET в силу необходимости его использования в powershell.

Судя по документации - да.
Но я не вижу смысла, вижу только потенциальные проблемы например что, если версия NET на компе будет ниже установленной в системе?
В целом, для меня это будет неплохим подспорьем, даже при всех минусах такого подхода.
Спасибо!
0
Avazart
Эксперт С++
7934 / 5754 / 570
Регистрация: 10.12.2010
Сообщений: 26,402
Записей в блоге: 17
08.10.2018, 14:36  [ТС] 6
Цитата Сообщение от v_svitere Посмотреть сообщение
В целом, для меня это будет неплохим подспорьем, даже при всех минусах такого подхода.
Спасибо!
Нужно смотреть и читать документацию.
Вероятно использовать можно, если выставлять совместимость с NET самой низкой версии.

Тут дело в том что думаю большая часть вещей которую будет требоваться автоматизировать будет касаться WinApi а такие вещи как мне кажется делаются проще именно на С/С++. И сторонние библиотеки тоже частенько написаны на Си.
0
v_svitere
697 / 408 / 134
Регистрация: 03.06.2009
Сообщений: 1,190
Записей в блоге: 4
08.10.2018, 14:52 7
Avazart,
Тут дело в том что думаю большая часть вещей которую будет требоваться автоматизировать будет касаться WinApi а такие вещи как мне кажется делаются проще именно на С/С++. И сторонние библиотеки тоже частенько написаны на Си.
Да, вы правы.

Я ранее использовал WINAPI из INNO-установщика, но делал это витиевато, получалось примерно так
Запускал Powershell, загружал с# сборку из исходного кода, ну а в самом классе уже использовал WINAPI.

Собственно, ваш вариант гораздо лучше, ну и я думаю, что при желании, можно конечно и на c++ написать, с помощью гугла.
0
08.10.2018, 14:52
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.10.2018, 14:52

Access violation при использовании подпрограмм из DLL
Ошибка возникает при нажатии кнопки &quot;Выполнить&quot;. Алгоритм функции и процедуры - правильный(проверял...

При доступе к DLL API access violation exception
Доброго времени суток. Я пытаюсь использовать API сторонней ноунейм DLL. Есть абстрактный класс с...

Ошибка "0xC0000005: Access violation" при вызове LookupAccountName
Здравствуйте. Мне надо проверить права доступа к файлу для текущего пользователя. Написал класс...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru