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

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

03.12.2015, 12:10. Показов 2503. Ответов 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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
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
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru