Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707

Из-за wcstombs_s не открывается скомпилированное приложение

03.12.2015, 12:10. Показов 2416. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую.
Ошибок компилятор не выдает. Приложение работает как надо, если запускаю его через компилятор.
Но если запускать уже скомпилированную программу через .exe, то она не запускается.
И именно из-за этой функции wcstombs_s, или wcstombs.
Почему?

Добавлено через 4 минуты
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
#if defined(WIN32)
#define MAIN_NEED_CLEAR_ARGV
#include <shellapi.h>
int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE, wchar_t*, int nCmdShow) {
    int argc;
    char** argv;
    {
        LPWSTR* lpArgv = CommandLineToArgvW(GetCommandLineW(), &argc);
        argv = (char**)malloc(argc*sizeof(char*));
        int size, i = 0;
        for (; i < argc; ++i)
        {
            size_t d;
            if (lpArgv) {
                size = wcslen(lpArgv[i]) + 1;
                argv[i] = (char *)malloc(size);
                wcstombs_s(&d, argv[i], strlen(argv[i]), lpArgv[i], size);
                //wcstombs(argv[i], lpArgv[i], size);
            }
        }
        LocalFree(lpArgv);
    }
#else
int main(int argc, char *argv[]) {
#endif
 
    return 0;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.12.2015, 12:10
Ответы с готовыми решениями:

Ошибок при компиляции нет, но скомпилированное приложение не открывается
Именно проблемы. Ошибок при компиляции не находит, но скомпилированное приложение не открывается. Подскажите, в чем проблема.

Код в скомпилированное приложение
Вообщем есть у меня скомпилированное linux приложение, написанное на c++. Есть документация по установке, настройке, но нет исходников. По...

Код в скомпилированное приложение
Вообщем есть у меня скомпилированное linux приложение, написанное на c++. Есть документация по установке, настройке, но нет исходников. По...

12
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
03.12.2015, 12:15
Цитата Сообщение от Randen Посмотреть сообщение
через .exe, то она не запускается.
Вероятно не хватает динамической либы (которую IDE успешно находит). Проверь зависимости программы, например с помощью Dependency Walker.
1
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
03.12.2015, 12:36  [ТС]
Вот что волкер не может найти, как я понимаю:
API-MS-WIN-CORE-KERNEL32-PRIVATE-L1-1-1.DLL
API-MS-WIN-CORE-PRIVATEPROFILE-L1-1-1.DLL
API-MS-WIN-SERVICE-PRIVATE-L1-1-1.DLL
API-MS-WIN-CORE-SHUTDOWN-L1-1-1.DLL
EXT-MS-WIN-MF-PAL-L1-1-0.DLL
EXT-MS-WIN-NTUSER-UICONTEXT-EXT-L1-1-0.DLL
IESHIMS.DLL
Добавлено через 22 секунды
Как-то многовато для 1 функции...

Добавлено через 9 минут
Тот же список волкер выдает и на другую программу, в которой нет wcstombs_s и которая открывается.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
03.12.2015, 12:42
<cstdlib> где?
1
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
03.12.2015, 12:47  [ТС]
nmcf, добавил, не помогло. Зачем оно?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
03.12.2015, 13:12
Там эта функция находится.
Так что происходит-то? Сообщение об ошибке есть?
0
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
03.12.2015, 13:18  [ТС]
В справке msdn написано что нужно:
C++
1
#include <stdlib.h>
Но и это не помогает

Добавлено через 31 секунду
nmcf, нет ошибок никаких, всё работает через компилятор. Но через запуск самого .exe не открывается программа.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
03.12.2015, 13:39
А собственно что должно произойти-то? Твоя программа ничего не делает, кроме манипуляций с параметрами, даже память после malloc() не освобождает.
0
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
03.12.2015, 13:45  [ТС]
Вот весь код main.cc:
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#include "application.h"
#include "view.h"
#include "method_dispatcher.h"
#include <string>
#include <stdlib.h>
#include <cstdlib>
#include <Awesomium/WebCore.h>
#include <Awesomium/STLHelpers.h>
#ifdef _WIN32
#include <Windows.h>
#endif
#include "config.h"
 
using namespace Awesomium;
 
class my_Listener : public Awesomium::WebViewListener::Load {
public:
    /// This event occurs when the page begins loading a frame.
    virtual void OnBeginLoadingFrame(Awesomium::WebView* caller,
        int64 frame_id,
        bool is_main_frame,
        const Awesomium::WebURL& url,
        bool is_error_page) {
        if (is_main_frame) {
            
        }
    };
 
    /// This event occurs when a frame fails to load. See error_desc
    /// for additional information.
    virtual void OnFailLoadingFrame(Awesomium::WebView* caller,
        int64 frame_id,
        bool is_main_frame,
        const Awesomium::WebURL& url,
        int error_code,
        const Awesomium::WebString& error_desc) {};
 
    /// This event occurs when the page finishes loading a frame.
    /// The main frame always finishes loading last for a given page load.
    virtual void OnFinishLoadingFrame(Awesomium::WebView* caller,
        int64 frame_id,
        bool is_main_frame,
        const Awesomium::WebURL& url) override {
        if (is_main_frame) {
            
        }
    };
 
    /// This event occurs when the DOM has finished parsing and the
    /// window object is available for JavaScript execution.
    virtual void OnDocumentReady(Awesomium::WebView* caller,
        const Awesomium::WebURL& url) {
 
    };
};
 
class TutorialApp : public Application::Listener {
    Application* app_;
    View* view_;
    MethodDispatcher method_dispatcher_;
    WebView* web_view;
    JSValue window;
public:
    TutorialApp()
        : app_(Application::Create()),
        view_(0) {
        app_->set_listener(this);
    }
 
    virtual ~TutorialApp() {
        if (view_)
            app_->DestroyView(view_);
    }
 
    void Run() {
        app_->Run();
    }
 
    // Inherited from Application::Listener
    virtual void OnLoaded() {
        view_ = View::Create(1366, 800);
        web_view = view_->web_view();
 
        my_Listener* my_listener = new my_Listener;
        web_view->set_load_listener(my_listener);
 
        BindMethods(web_view);
 
        window = web_view->ExecuteJavascriptWithResult(WSLit("window"), WSLit(""));
        
        WebURL url(WSLit("http://yandex.ru"));
        web_view->LoadURL(url);
    }
 
    // Inherited from Application::Listener
    virtual void OnUpdate() {
    }
 
    // Inherited from Application::Listener
    virtual void OnShutdown() {
        web_view->Destroy();
    }
 
    void BindMethods(WebView* web_view) {
        // Create a global js object named 'app'
        JSValue result = web_view->CreateGlobalJavascriptObject(WSLit("app"));
        if (result.IsObject()) {
            // Bind our custom method to it.
            JSObject& app_object = result.ToObject();
            method_dispatcher_.Bind(app_object,
                WSLit("sayHello"),
                JSDelegate(this, &TutorialApp::OnSayHello));
        }
 
        // Bind our method dispatcher to the WebView
        web_view->set_js_method_handler(&method_dispatcher_);
    }
 
    // Bound to app.sayHello() in JavaScript
    void OnSayHello(WebView* caller,
        const JSArray& args) {
        app_->ShowMessage("Hello!");
    }
};
 
wchar_t *convertCharArrayToLPCWSTR(const char* charArray)
{
    wchar_t* wString = new wchar_t[4096];
    MultiByteToWideChar(CP_ACP, 0, charArray, -1, wString, 4096);
    return wString;
}
 
#if defined(WIN32)
#define MAIN_NEED_CLEAR_ARGV
#include <shellapi.h>
int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE, wchar_t*, int nCmdShow) {
    int argc;
    char** argv;
    {
        LPWSTR* lpArgv = CommandLineToArgvW(GetCommandLineW(), &argc);
        argv = (char**)malloc(argc*sizeof(char*));
        int size, i = 0;
        for (; i < argc; ++i)
        {
            size_t d;
            if (lpArgv) {
                size = wcslen(lpArgv[i]) + 1;
                argv[i] = (char *)malloc(size);
                wcstombs_s(&d, argv[i], strlen(argv[i]), lpArgv[i], size);
                //wcstombs(argv[i], lpArgv[i], size);
            }
        }
        LocalFree(lpArgv);
    }
#else
int main(int argc, char *argv[]) {
#endif
    TutorialApp app;
    app.Run();
    
 
    MessageBoxW(0, convertCharArrayToLPCWSTR(argv[0]), convertCharArrayToLPCWSTR(argv[0]), NULL);
 
    //SendMessage(hwnd, WM_MYMESSAGE, 0, 0);
 
    return 0;
}
 
/*
#ifdef MAIN_NEED_CLEAR_ARGV
{
int i = 0;
for (; i < argc; ++i)
free(argv[i]);
free(argv);
}
#endif
*/
Я не знаю куда засунуть кусок снизу, который в комментах, чтобы освободить память.

Должно открыться окно как минимум, но этого не происходит.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
03.12.2015, 14:01
Это вообще что? Приложение на основе какой-то библиотеки?
Что у тебя работает - wWinMain() или простой main()? Если первый, то он ничего не делает.
0
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
03.12.2015, 14:38  [ТС]
nmcf, wWinMain().
Всё работает как надо, но только запуская через компилятор. Запуская через .exe не открывается программа.
Но если закомментить строку
C++
1
wcstombs_s(&d, argv[i], strlen(argv[i]), lpArgv[i], size);
То и запуская через .exe всё работает как надо.

Почему?

Добавлено через 23 секунды
Цитата Сообщение от nmcf Посмотреть сообщение
Это вообще что? Приложение на основе какой-то библиотеки?
да.

Добавлено через 1 минуту
Цитата Сообщение от nmcf Посмотреть сообщение
Если первый, то он ничего не делает.
код
C++
1
2
3
4
5
6
7
8
9
TutorialApp app;
    app.Run();
    
 
    MessageBoxW(0, convertCharArrayToLPCWSTR(argv[0]), convertCharArrayToLPCWSTR(argv[0]), NULL);
 
    //SendMessage(hwnd, WM_MYMESSAGE, 0, 0);
 
    return 0;
выполняется и для wWinMain() и для main(), смотря как сработает условие

Добавлено через 3 минуты
Добавил
C++
1
#define _CRT_SECURE_NO_WARNINGS
Заменил wcstombs_s на wcstombs и всё работает как и должно.
Но раз wcstombs не безопасна, то лучше использовать wcstombs_s.
Но с wcstombs_s не работает как надо. Что за фигня?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
03.12.2015, 14:51
Лучший ответ Сообщение было отмечено SatanaXIII как решение

Решение

Цитата Сообщение от Randen Посмотреть сообщение
C++
1
2
argv[i] = (char *)malloc(size); // здесь мы только выделели память, иницализации не было - в ней мусор
wcstombs_s(&d, argv[i], strlen(argv[i]), lpArgv[i], size);
Почему тут strlen делается для неинициализированного буфера? Скорее всего именно в этом проблема.
C++
1
wcstombs_s(&d, argv[i], size, lpArgv[i], size);
1
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
03.12.2015, 15:05  [ТС]
DrOffset, помогло спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.12.2015, 15:05
Помогаю со студенческими работами здесь

Скомпилированное приложение не запускается на Windows 7
Добрый день! Работаю на VB6.0 на вин10. Скомпилировал экзешник, запускаю на вин 10 - все работает. Перекидываю экзешник на ПК с вин7 и...

Скомпилированное приложение не работает на другом ПК
Я компилю программу и смотрю исполняемый файл в папке Debug, но он не хочет запускаться на другом компе, учитывая что .NET framework стоит...

Не запускается любое скомпилированное приложение в Windows 7
Привет! У меня возникла такая проблема: хочу скомпилировать любую программу на C в Dev-Cpp, а на выходе получаю exe-файл размером 4,50...

Скомпилированное приложение не запускается без установленной VS
Есть программа на VB. Все работает все устраивает, но... .exe файл работает не на всех компьютерах, а только там где установлена Visual...

Добавление bat файлов в скомпилированное приложение
Здравствуйте! Нарисовал приложение на Windows Forms в Visual Studio 2010 По сути, это пользовательский интерфейс для запуска...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru