Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Galadriel1987
2 / 2 / 1
Регистрация: 23.03.2013
Сообщений: 47
#1

Ошибки LNK2001 и С2664 в Visual Studio 2008 - C++

02.12.2015, 20:49. Просмотров 283. Ответов 12
Метки нет (Все метки)

Здравствуйте! При написании простой программы запуска Блокнота у меня возникла проблема с Кодировкой. При включенном параметре "Использовать Юникод" выдается ошибка:

Main.cpp(24) : error C2664: CreateProcessW: невозможно преобразовать параметр 2 из 'const char [12]' в 'LPWSTR'

При включенном параметре "Использовать многобайтовую кодировку" появляется сообщение:

LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main (запрещенный внешний символ).

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

Вот текст программы:

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
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
 
void tmain(int argc, TCHAR *argv[])
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
 
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory ( &pi, sizeof(pi) );
 
//
if( !CreateProcess( NULL,
"notepad.exe",
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si,
&pi )
)
{
printf( "CreateProcess failed (%d).\n", GetLastError() );
return;
 
}
 
//
WaitForSingleObject( pi.hProcess, INFINITE );
 
//
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
Я совсем запуталась: вот здесь - http://habrahabr.ru/post/164193/ рассказано обо всех кодировках, но я ума не приложу, как это использовать. Меняла void tmain на int main и tchar на wchar_t. Все без толку.
Еще нашла вот здесь - LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main упоминание о типе проекта. Проверила - тип проекта - Приложение Win32. Проект "чистый", сделанный не в Мастере.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2015, 20:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибки LNK2001 и С2664 в Visual Studio 2008 (C++):

Проблемы при создании и построении проекта Microsoft Visual Studio 2008 Ошибки! - C++
Проблемы при создании и построении проекта Microsoft Visual Studio 2008. Ошибки!!!

Написать программу. Задания нужно выполнять на языке Visual C++ в среде Microsoft Visual Studio 2008 - C++
Можете написать программу? Задание по номером 3.24 (2 рисунок).

несовместимость visual c++ 6.0 и visual studio 2008 - C++
почему правильно написанная программа в visual c++ 6.0 не работает в visual studio 2008 , а именно #include &lt;iostream&gt; using namespace...

несовместимость visual c++ 6.0 и visual studio 2008 - C++
почему правильно гаписанная программа в visual c++ 6.0 не работает в visual studio 2008 , а именно #include &lt;iostream&gt; ...

Visual studio 2008 C++ - C++
Вычислите сумму элементов верхнего правого треугольника матрицы и количество элементов в нем. матрица размером 5x5

Visual Studio 2008 - C++
Здравствуйте.У меня студия 2010 (экспресс-версия) поставилась,но при запуске уже когда ввел уже код(я уже активировал когда-то,но тогда 7...

12
nmcf
5353 / 4673 / 1564
Регистрация: 14.04.2014
Сообщений: 18,627
02.12.2015, 20:58 #2
C++
1
L"notepad.exe"
Все функции с W принимают юникод-строки.
0
Galadriel1987
2 / 2 / 1
Регистрация: 23.03.2013
Сообщений: 47
02.12.2015, 21:01  [ТС] #3
Спасибо, но уже "опробовала" - никак! L я добавляла в первую очередь, так как на Хабрахабре об этом написано.
0
zss
Модератор
Эксперт С++
6478 / 6041 / 1983
Регистрация: 18.12.2011
Сообщений: 15,662
Завершенные тесты: 1
02.12.2015, 21:05 #4
Попробовал
C++
1
2
3
if( !CreateProcess( NULL,
L"notepad.exe",
...
Прекрасно компилируется!
0
Galadriel1987
2 / 2 / 1
Регистрация: 23.03.2013
Сообщений: 47
02.12.2015, 21:10  [ТС] #5
Цитата Сообщение от zss Посмотреть сообщение
if( !CreateProcess( NULL, L"notepad.exe", ...
Хорошо, сейчас еще раз попробую. А void tmain на int main менять не надо?
0
zss
Модератор
Эксперт С++
6478 / 6041 / 1983
Регистрация: 18.12.2011
Сообщений: 15,662
Завершенные тесты: 1
02.12.2015, 21:15 #6
int main - это стандарт.
0
Galadriel1987
2 / 2 / 1
Регистрация: 23.03.2013
Сообщений: 47
03.12.2015, 14:24  [ТС] #7
Что значит стандарт? Заменить void tmain на int main?
Надо просто написать вместо
void tmain(int argc, TCHAR *argv[])
Вот это:
int wmain(int argc, wchar_t *argv[], wchar_t *envp[]);

Вот скриншоты с ошибками (сделала вложением):
0
Миниатюры
Ошибки LNK2001 и С2664 в Visual Studio 2008   Ошибки LNK2001 и С2664 в Visual Studio 2008  
nmcf
5353 / 4673 / 1564
Регистрация: 14.04.2014
Сообщений: 18,627
03.12.2015, 16:17 #8
Так оно заработало?
0
Galadriel1987
2 / 2 / 1
Регистрация: 23.03.2013
Сообщений: 47
03.12.2015, 16:27  [ТС] #9
Цитата Сообщение от nmcf Посмотреть сообщение
Так оно заработало?
Нет, так и не заработало - по прежнему эти две ошибки в разных версиях кодировки. Очень жаль.
Радует одно - столько умных людей прочитало и все такие же как я - чайники, не в состоянии сказать новичку, что делать .
0
nmcf
5353 / 4673 / 1564
Регистрация: 14.04.2014
Сообщений: 18,627
03.12.2015, 16:33 #10
В первом случае отключен юникод, значит L перед строкой не нужен.
У тебя, вероятно, неправильный тип проекта. Создай новый и выбери там "Консольное приложение win32". У тебя не консольное.
1
Galadriel1987
2 / 2 / 1
Регистрация: 23.03.2013
Сообщений: 47
03.12.2015, 17:03  [ТС] #11
Да я уже создавала и консольное, и даже какое-то ATL, в общем, у меня уже 7 проектов CreateProcess, которые я без конца удаляю

Добавлено через 25 минут
Цитата Сообщение от zss Посмотреть сообщение
Попробовал
C++
Выделить код
1
2
3
if( !CreateProcess( NULL,
L"notepad.exe",
...
Прекрасно компилируется!
Дайте скриншот, пожалуйста, чтобы я могла приложить его к отчету. И как у Вас оно заработало, если у меня в исходном тексте нет этого самого "Стандартного" int main()? Без которого, как Вы говорите, оно и не работает вовсе?
Почему же у Вас тогда заработало? Или вы издеваетесь?
0
nmcf
5353 / 4673 / 1564
Регистрация: 14.04.2014
Сообщений: 18,627
03.12.2015, 17:27 #12
Чтобы стандартный main() был, надо создать пустой проект, а потом добавить в него новый файл .cpp и вручную написать там main().
0
zss
Модератор
Эксперт С++
6478 / 6041 / 1983
Регистрация: 18.12.2011
Сообщений: 15,662
Завершенные тесты: 1
03.12.2015, 17:49 #13
Я компилировал это
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
#include <windows.h>
#include <stdio.h>
#include <conio.h>
//#include <tchar.h>
 
int main()
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
 
    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory ( &pi, sizeof(pi) );
 
    //
    if( !CreateProcess( NULL,
        L"notepad.exe",
        NULL,
        NULL,
        FALSE,
        0,
        NULL,
        NULL,
        &si,
        &pi )
        )
    {
        printf( "CreateProcess failed (%d).\n", GetLastError() );
        return 1;
 
    }
 
    //
    WaitForSingleObject( pi.hProcess, INFINITE );
 
    //
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
    _getch();
    return 0;
}
Нашел интересное замечание в описании
lpCommandLine
The command line to be executed. The maximum length of this string is 32,768 characters, including the Unicode terminating null character. If lpApplicationName is NULL, the module name portion of lpCommandLine is limited to MAX_PATH characters.

The Unicode version of this function, CreateProcessW, can modify the contents of this string. Therefore, this parameter cannot be a pointer to read-only memory (such as a const variable or a literal string). If this parameter is a constant string, the function may cause an access violation.
В соответствии с ним надо писать
C++
1
2
3
4
5
 wchar_t AppName[]=L"notepad.exe";
    //
    if( !CreateProcess( NULL,
        AppName,
...
0
03.12.2015, 17:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2015, 17:49
Привет! Вот еще темы с ответами:

Множества Visual Studio 2008 - C++
Существует ли подобный способ в VS 2008, как в VS 2015, задания значение множеству таким образом: set&lt;char&gt; m1 = { 'а', 'е', 'ё', 'и',...

Вопрос по Visual Studio 2008 - C++
Запустил программку в 11 утра сегодня. До сих пор выполняется. Надо с работы уходить домой. Думаю прийти в понедельник и посмотреть за...

[C#] Visual studio 2008 анимация - C++
Суть в следующем: Необходимо что бы замкунутый сплайн, (который условно представляет собой кусочек угля) Point aa =...

Visual Studio 2008 Prof - C++
При попытке запуска программы в компиляторе выводит следующую ошибку. 1&gt;LINK : fatal error LNK1104: не удается открыть файл...


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

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

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