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

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

Восстановить пароль Регистрация
 
Galadriel1987
 Аватар для Galadriel1987
0 / 0 / 0
Регистрация: 23.03.2013
Сообщений: 44
02.12.2015, 20:49     Ошибки LNK2001 и С2664 в Visual Studio 2008 #1
Здравствуйте! При написании простой программы запуска Блокнота у меня возникла проблема с Кодировкой. При включенном параметре "Использовать Юникод" выдается ошибка:

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. Проект "чистый", сделанный не в Мастере.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2015, 20:49     Ошибки LNK2001 и С2664 в Visual Studio 2008
Посмотрите здесь:

Софт visual Studio 2008
Софт visual studio 2008
C++ Qt Qt и Visual Studio 2008
C++ Вопрос по Visual Studio 2008
SQL Server БД + C++(MS Visual Studio 2008)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4278 / 3709 / 1246
Регистрация: 14.04.2014
Сообщений: 14,503
02.12.2015, 20:58     Ошибки LNK2001 и С2664 в Visual Studio 2008 #2
C++
1
L"notepad.exe"
Все функции с W принимают юникод-строки.
Galadriel1987
 Аватар для Galadriel1987
0 / 0 / 0
Регистрация: 23.03.2013
Сообщений: 44
02.12.2015, 21:01  [ТС]     Ошибки LNK2001 и С2664 в Visual Studio 2008 #3
Спасибо, но уже "опробовала" - никак! L я добавляла в первую очередь, так как на Хабрахабре об этом написано.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
02.12.2015, 21:05     Ошибки LNK2001 и С2664 в Visual Studio 2008 #4
Попробовал
C++
1
2
3
if( !CreateProcess( NULL,
L"notepad.exe",
...
Прекрасно компилируется!
Galadriel1987
 Аватар для Galadriel1987
0 / 0 / 0
Регистрация: 23.03.2013
Сообщений: 44
02.12.2015, 21:10  [ТС]     Ошибки LNK2001 и С2664 в Visual Studio 2008 #5
Цитата Сообщение от zss Посмотреть сообщение
if( !CreateProcess( NULL, L"notepad.exe", ...
Хорошо, сейчас еще раз попробую. А void tmain на int main менять не надо?
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
02.12.2015, 21:15     Ошибки LNK2001 и С2664 в Visual Studio 2008 #6
int main - это стандарт.
Galadriel1987
 Аватар для Galadriel1987
0 / 0 / 0
Регистрация: 23.03.2013
Сообщений: 44
03.12.2015, 14:24  [ТС]     Ошибки LNK2001 и С2664 в Visual Studio 2008 #7
Что значит стандарт? Заменить void tmain на int main?
Надо просто написать вместо
void tmain(int argc, TCHAR *argv[])
Вот это:
int wmain(int argc, wchar_t *argv[], wchar_t *envp[]);

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

Добавлено через 25 минут
Цитата Сообщение от zss Посмотреть сообщение
Попробовал
C++
Выделить код
1
2
3
if( !CreateProcess( NULL,
L"notepad.exe",
...
Прекрасно компилируется!
Дайте скриншот, пожалуйста, чтобы я могла приложить его к отчету. И как у Вас оно заработало, если у меня в исходном тексте нет этого самого "Стандартного" int main()? Без которого, как Вы говорите, оно и не работает вовсе?
Почему же у Вас тогда заработало? Или вы издеваетесь?
nmcf
4278 / 3709 / 1246
Регистрация: 14.04.2014
Сообщений: 14,503
03.12.2015, 17:27     Ошибки LNK2001 и С2664 в Visual Studio 2008 #12
Чтобы стандартный main() был, надо создать пустой проект, а потом добавить в него новый файл .cpp и вручную написать там main().
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2015, 17:49     Ошибки LNK2001 и С2664 в Visual Studio 2008
Еще ссылки по теме:

visual studio 2008
Visual C++ как искать ошибки? и какой лучше учебник почитать по visual studio 2008
XNA Для тех, у кого visual studio 2008 и XNA game studio 3.0

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

Или воспользуйтесь поиском по форуму:
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
03.12.2015, 17:49     Ошибки LNK2001 и С2664 в Visual Studio 2008 #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,
...
Yandex
Объявления
03.12.2015, 17:49     Ошибки LNK2001 и С2664 в Visual Studio 2008
Ответ Создать тему
Опции темы

Текущее время: 05:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru