What is causing this error? I google’d it and first few solutions I found were that something was wrong with the library and the main function but both seem to be fine in my problem, I even retyped both! What could be causing this?
This might be helpful:
MSVCRTD.lib(crtexew.obj) : error LNK2019: unresolved external symbol WinMain@16 referenced in function __tmainCRTStartup
#include <iostream>
using namespace std;
int main()
{
const double A = 15.0,
B = 12.0,
C = 9.0;
double aTotal, bTotal, cTotal, total;
int numSold;
cout << "Enter The Number of Class A Tickets Sold: ";
cin >> numSold;
aTotal = numSold * A;
cout << "Enter The Number of Class B Tickets Sold: ";
cin >> numSold;
bTotal = numSold * B;
cout << "Enter The Number of Class C Tickets Sold: ";
cin >> numSold;
cTotal = numSold * C;
total = aTotal + bTotal + cTotal;
cout << "Income Generated" << endl;
cout << "From Class A Seats $" << aTotal << endl;
cout << "From Class B Seats $" << bTotal << endl;
cout << "From Class C Seats $" << cTotal << endl;
cout << "-----------------------" << endl;
cout << "Total Income: " << total << endl;
return 0;
}
asked Sep 14, 2011 at 2:58
Howdy_McGeeHowdy_McGee
10.3k29 gold badges109 silver badges185 bronze badges
3
From msdn
When you created the project, you made the wrong choice of application
type. When asked whether your project was a console application or a
windows application or a DLL or a static library, you made the wrong
chose windows application (wrong choice).Go back, start over again, go to File -> New -> Project -> Win32
Console Application -> name your app -> click next -> click
application settings.For the application type, make sure Console Application is selected
(this step is the vital step).The main for a windows application is called WinMain, for a DLL is
called DllMain, for a .NET application is called
Main(cli::array ^), and a static library doesn’t have a
main. Only in a console app is main called main
answered Sep 14, 2011 at 3:06
DrahakarDrahakar
5,9466 gold badges42 silver badges58 bronze badges
1
I incurred this error once.
It turns out I had named my program ProgramMame.ccp instead of ProgramName.cpp
easy to do …
Hope this may help
answered Oct 25, 2012 at 15:58
Bob in SCBob in SC
1411 silver badge2 bronze badges
My problem was
int Main()
instead of
int main()
good luck
answered Nov 21, 2012 at 13:19
MahikaMahika
6622 gold badges11 silver badges21 bronze badges
Well it seems that you are missing a reference to some library. I had the similar error solved it by adding a reference to the #pragma comment(lib, «windowscodecs.lib»)
answered Apr 25, 2015 at 10:18
G droidG droid
9565 gold badges13 silver badges36 bronze badges
In my case, the argument type was different in the header file and .cpp file. In the header file the type was std::wstring and in the .cpp file it was LPCWSTR.
Dharman♦
29.3k21 gold badges80 silver badges131 bronze badges
answered Sep 23, 2020 at 11:18
Vasantha GaneshVasantha Ganesh
4,4203 gold badges23 silver badges33 bronze badges
You must reference it. To do this, open the shortcut menu for the project in Solution Explorer, and then choose References. In the Property Pages dialog box, expand the Common Properties node, select Framework and References, and then choose the Add New Reference button.
answered Jul 5, 2016 at 10:06
Amir TouitouAmir Touitou
3,0011 gold badge35 silver badges31 bronze badges
I have faced this particular error when I didn’t defined the main() function. Check if the main() function exists or check the name of the function letter by letter as Timothy described above or check if the file where the main function is located is included to your project.
answered Sep 21, 2016 at 9:02
funkfunk
2,1111 gold badge22 silver badges22 bronze badges
1
In my particular case, this error error was happening because the file which I’ve added wasn’t referenced at .vcproj file.
answered Nov 19, 2019 at 16:32
dbzdbz
3817 silver badges22 bronze badges
In my case I got this error when I had declared a function under ‘public’ access specifier. Issue got resolved when I declared that function as private.
answered Mar 11, 2021 at 18:12
I have encountered the same error. For me it turned out to be because I tried to implement an inline function in the .cpp file, instead of putting it in the header file, where the definition is. Therefore when I tried to include the header file and use the function, I got this error.
answered Nov 25, 2021 at 22:56
My case: I defined a prototype of the class de-constructor, but forgot to define the body.
class SomeClass {
~SomeClass(); //error
};
class SomeClass {
~SomeClass(){}; //no error
}
answered Jul 9, 2022 at 4:23
In my case I had forgotten to add the main() function altogether.
answered Jul 29, 2022 at 5:34
Содержание
- Помогите с ошибками LNK2019 LNK1120
- LNK1120: 1 неразрешенный внешний вид и LNK2019: неразрешенный внешний символ
- Решение
- Другие решения
- Fatal error lnk1120 неразрешенных внешних элементов 10
- Лучший отвечающий
- Вопрос
- Ответы
- Все ответы
- C++ фатальная ошибка LNK1120: 1 неразрешенные внешние
- 6 ответов
- Fatal error lnk1120 неразрешенных внешних элементов 10
Помогите с ошибками LNK2019 LNK1120
Периодически сталкиваюсь с проблемой линкера
Лог приведен ниже. Проблема явно в моем не знании природы ошибки, кому не сложно объясните вкратце.
1>DXUTcamera.obj : error LNK2019: ссылка на неразрешенный внешний символ «long __stdcall DXUTCreateArrowMeshFromInternalArray(struct IDirect3DDevice9 *,struct ID3DXMesh * *)» (?DXUTCreateArrowMeshFromInternalArray@@YGJPAUIDirect3DDevice9@@PAPAUID3DXMesh@@@Z) в функции «public: static long __stdcall CDXUTDirectionWidget::StaticOnD3D9CreateDevice(struct IDirect3DDevice9 *)» (?StaticOnD3D9CreateDevice@CDXUTDirectionWidget@@SGJPAUIDirect3DDevice9@@@Z)
1>DebugEmptyProject10.exe : fatal error LNK1120: 1 неразрешенных внешних элементов
msdn прочитал, все что понял что вызываю функцию которая «не разрешена» что это значит? как ее разрешитЬ? я все проинклюдил, причем в том что проинклюдил эта функция есть.
ExcIuZive
> я все проинклюдил, причем в том что проинклюдил эта функция есть.
А cpp файлы или lib где есть описание этих функций подсоеденил?
> msdn прочитал, все что понял что вызываю функцию которая «не разрешена» что это значит?
Эта ошибка означает что функция объявлена, но линковщик не может отыскать ее описание
cpp и h файлы добавил в прокет (VS2010)
проинклудил h файл
а библиотеки.. ну только которые изначально d3d10.lib и d3dx10.lib. То есть все компилилось, начал прикручивать камеру через DXUT и вылезла вот эта ошибка.
Источник
LNK1120: 1 неразрешенный внешний вид и LNK2019: неразрешенный внешний символ
Я получаю эти две ошибки, и я не могу найти решение, которое работает.
LNK1120: 1 неразрешенное внешнее
Ошибка 1 ошибка LNK2019: неразрешенный внешний символ «public: __thiscall Vector3D :: Vector3D (класс Vector3D const &) «(?? 0Vector3D @@ QAE @ ABV0 @@ Z) ссылка на функцию» public: класс Vector3D __thiscall Vertex :: GetPosition (void) «(? GetPosition @ Vertex @@ QAE? AVVector3D @@ XZ)
Я думаю, что это связано с моим оператором Matrix и конструктором в моем классе Vector 3d
Любая помощь будет высоко ценится, так как я новичок в C ++
Решение
Это говорит о том, что компоновщик не может найти реализацию Vector3D(const Vector3D& rhs); , Этот конструктор объявлен в вашем векторном классе, но не определен.
У вас есть реализация конструктора где-то в .cpp файл, а этот файл известен вашему компилятору?
Компиляция C / C ++ работает так: сначала у вас есть несколько так называемых «модулей компиляции» — обычно каждый .cpp -file является одним из таких модулей компиляции. Ваша программа состоит из всех этих отдельных модулей, связанных друг с другом (процесс «связывания» происходит после компиляции). Каждая функция, которая вызывается где-то, должна быть определена ровно один раз в некотором модуле компиляции, если он не определен встроенным (как другие методы вашего класса). Если метод объявлен, но не определен, компилятор не будет жаловаться — только компоновщик. Представьте себе блоки компиляции, имеющие «розетки» и «соединители», которые соответствуют соответствующим «розеткам» других блоков. Процесс компиляции просто создает эти модули, принимая определенную форму «сокета» (как указано в объявлениях), тогда как компоновщик фактически пытается соединить каждый «сокет» с его «соединителем». Итак, вы видите, как процесс компиляции может быть успешным, но ссылки нет.
Ошибки компоновщика могут быть сложно решить, особенно если вы еще не так опытны. Там может быть много причин для них:
- Отсутствует реализация / определение
- Определение существует, но почему-то не компилируется (потому что файл не передается компилятору и т. Д.)
- Различные версии библиотек и т. Д.
И многое другое ..
Редактировать: Кроме того, вы должны передать вектор по константной ссылке и создать newVector, вызвав его конструктор, вместо создания объекта по умолчанию и последующего присвоения. И окончательное строительство в return statement тоже не нужен. Улучшенный код:
Другие решения
Ваша реализация Vector3D кажется, что отсутствует фактическая реализация для конструктора копирования, следовательно, неразрешенная внешняя ошибка. Если вы не собираетесь копировать объект Vector3D, вы не сможете передать его в Matrix::operator* по значению, что бы вызвать копию.
Тем не менее, я не думаю, что есть какие-либо причины объявлять и реализовывать конструктор копирования для Vector3D в любом случае, поскольку он содержит только POD-типы, и сгенерированный компилятором конструктор копирования будет работать нормально. То же самое относится и к деструктору, ресурсы для управления отсутствуют, поэтому пусть компилятор выполняет свою работу.
Вы реализовали Vector3D конструктор по умолчанию, конструктор копирования и деструктор? Вы показали свои заголовки, но не файлы реализации. Линкер жалуется на отсутствие определения Vector3D::Vector3D(Vector3D const&) ,
Источник
Fatal error lnk1120 неразрешенных внешних элементов 10
Лучший отвечающий
Вопрос
пытаюсь создать DLL, два файла MyLib.cpp
и файл main.def с содержимым
При компиляции с параметром /MD никаких ошибок не возникает.
При компиляции с параметром /MT выдает ошибки:
Ошибка 4 error LNK2001: неразрешенный внешний символ «Delete»
Ошибка 5 error LNK1120: неразрешенных внешних элементов: 1
При этом, если изменить Delete на Delete2, никаких ошибок не возникает.
как это исправить?
Ответы
Экспорт идентификаторов из DLL может быть выполнен двумя способами: через файл определения модуля (DEF) и модификаторами __declspec(dllexport). Второй способ более гибкий, т.к. имя функции «декорируется», т.е. добавляется информация о классе, пространстве имен и проч. Однако затрудняет явный поиск имени в разделе экспорта (т.к. только компилятор знает, какое имя в результате получится).
При использовании DEF-файла в раздел экспорта попадает лишь имя функции (без искажений), поэтому такое имя должно быть уникальным по всей DLL.
Можно сделать так: уберите из проекта DEF-файл, а определение функции перепишите в таком виде:
Т.е. функция должна вызываться по соглашению __cdecl, а extern «C» выключит декорирование ее имени.
Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!
Все ответы
При этом, если изменить Delete на Delete2, никаких ошибок не возникает.
Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!
При этом, если изменить Delete на Delete2, никаких ошибок не возникает.
Где изменить? У Вас def-файл имеет неверный формат. Имена экспортируемых функций должны записываться с отступом (не с первой позиции строки) и никакой точки с запятой в конце ставить не нужно.
Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!
Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!
Нет, не пробовал. Просто я не одну dll за свою жизнь написал и знаю формат def-файла.
Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!
Ну, так попробовал 🙂 Что же Вы не показали весь лог, а ограничились только двумя последними строчками? А он, между тем, выглядит так:
1>main.def : warning LNK4022: не удается найти уникальное соответствие для символа «Delete»
1>main.def : warning LNK4002: «void __fastcall Delete(void *)» (?Delete@@YIXPAX@Z) определен в ReleaseMyLib.obj
1>main.def : warning LNK4002: «public: bool __thiscall Concurrency::details::Hash ::Delete(class Concurrency::details::_TaskCollection * const &)» (?Delete@?$Hash@PAV_TaskCollection@details@Concurrency@@PAV123@@details@Concurrency@@QAE_NABQAV_TaskCollection@23@@Z) определен в C:Program Files (x86)Microsoft Visual Studio 12.0VClibLIBCMT.lib
1>main.def : error LNK2001: неразрешенный внешний символ «Delete»
1>MyLib.lib : fatal error LNK1120: неразрешенных внешних элементов: 1
По моему, все понятно написано. Ключ /MT включил использование статической библиотеки C++, в которой уже есть функция с именем Delete. В данном случае не важно, что она является методом класса, а не глобальной. Поэтому редактор связей не может создать в Вашей DLL правильный раздел экспорта.
Если непременно нужна статическая библиотека C++, имя функции придется изменить.
Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!
Источник
C++ фатальная ошибка LNK1120: 1 неразрешенные внешние
что вызывает эту ошибку? Я google это и первые несколько решений, которые я нашел, были что-то не так с библиотекой и основной функцией, но оба, похоже, в моей проблеме, я даже перепечатал оба! Что могло быть причиной этого?
Это может быть полезно:
библиотеки msvcrtd.lib (crtexew.obj): ошибка LNK2019: неразрешенный внешний символ WinMain@16 ссылается в функции __tmainCRTStartup
6 ответов
когда вы создали проект, вы сделали неправильный выбор приложения тип. Когда вас спросят, был ли ваш проект консольным приложением или приложение windows или DLL или статическая библиотека, вы сделали неправильно выберите приложение windows (неправильный выбор).
вернуться, начать сначала, перейдите в Файл — > Создать — > Проект — > Win32 Консольное приложение — > имя вашего приложения — > нажмите кнопку Далее — > нажмите приложение настройки.
для типа приложения убедитесь, что выбрано консольное приложение (этот шаг является жизненно важным шагом).
основной для приложения windows называется WinMain, для DLL называется DllMain, для приложения .NET называется Main (cli::array^), и статическая библиотека не имеет главный. Только в консольном приложении main называется main
однажды я допустил эту ошибку.
оказывается, я назвал свою программу ProgramMame.КПК вместо ProgramName.cpp
надеюсь, это может помочь
моя проблема была int Main () вместо int main ()
Ну, похоже, вам не хватает ссылки на какую-то библиотеку. У меня была аналогичная ошибка, решив ее, добавив ссылку на #Pragma comment (lib, «windowscodecs.lib»)
вы должны ссылаться на него. Для этого откройте контекстное меню проекта в обозревателе решений и выберите пункт ссылки. В диалоговом окне страницы свойств разверните узел общие свойства, выберите структура и ссылки, а затем нажмите кнопку Добавить новую ссылку.
Я столкнулся с этой конкретной ошибкой, когда я не определил функцию main (). Проверьте, существует ли функция main (), или проверьте имя функции буква за буквой, как описано выше Тимоти, или проверьте, включен ли файл, в котором находится основная функция, в ваш проект.
Источник
Fatal error lnk1120 неразрешенных внешних элементов 10
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.
Полезные ссылки:




Возникло желание избавится от зависимости от распространяемого пакета стандартных библиотек.
То есть сделать программу, в старом добром стиле, «всё сама».
Это просто сделать, взяв Assembler или даже C.
С C++ сложнее. Нужно брать что-то старое. К примеру visual studio 6. А может даже и старше.
Но я взял visual studio 2010. Причём именно C++. Ну вот нравятся мне те плюшки, которые в него добавили после 1998 года.



компилирую:
cl.exe /c /Od /WX /GS /GR /Zi /Zl /EHa /RTCs test.cpp /Fotest.obj > compile.log 2>&1
Всё ок. Получаю test.obj
линкую:
link.exe /debug test.obj /out:test.exe > link.txt 2>&1
Microsoft ® Incremental Linker Version 10.00.40219.01
Copyright © Microsoft Corporation. All rights reserved.
test.obj : error LNK2001: неразрешенный внешний символ «__RTC_Shutdown»
test.obj : error LNK2001: неразрешенный внешний символ «__RTC_InitBase»
LINK : error LNK2001: неразрешенный внешний символ «_mainCRTStartup»
test.exe : fatal error LNK1120: 3 неразрешенных внешних элементов
Наблюдаются сразу две проблемы!
Вторая это точка входа. Он видетели ждёт «_mainCRTStartup».
Исправляем прогу:



А первая. Это проверка стека.
Прощаемся с ключиком «/GS».
Компиляция, линковка:
cl.exe /c /Od /WX /GR /Zi /Zl /EHa /RTCs test.cpp /Fotest.obj > compile.log 2>&1
link.exe /debug test.obj /out:test.exe > link.txt 2>&1
Microsoft ® Incremental Linker Version 10.00.40219.01
Copyright © Microsoft Corporation. All rights reserved.
LINK : fatal error LNK1561: точка входа должна быть определена
Это так же понятно как лечить. Хоя, чего тогда искал _mainCRTStartup. А когда дал, развонялся?
Ладно, линкую заного:
link.exe /debug /entry:_mainCRTStartup test.obj /out:test.exe > link.txt 2>&1
Microsoft ® Incremental Linker Version 10.00.40219.01
Copyright © Microsoft Corporation. All rights reserved.
LINK : fatal error LNK1221: подсистема не может быть логически выведена, а должна быть определена
А сразу не мог сказать?!
Проблема решаема, опять линкую:
link.exe /debug /entry:_mainCRTStartup /subsystem:console test.obj /out:test.exe > link.txt 2>&1
И вновь не идёт:
Microsoft ® Incremental Linker Version 10.00.40219.01
Copyright © Microsoft Corporation. All rights reserved.
test.obj : error LNK2001: неразрешенный внешний символ «__RTC_Shutdown»
test.obj : error LNK2001: неразрешенный внешний символ «__RTC_InitBase»
test.exe : fatal error LNK1120: 2 неразрешенных внешних элементов
Прощаюсь с ключиком «/RTCs»
Перекомпилирую, линкую:
cl.exe /c /Od /WX /GR /Zi /Zl /EHa test.cpp /Fotest.obj > compile.log 2>&1
link.exe /debug /entry:_mainCRTStartup /subsystem:console test.obj /out:test.exe > link.txt 2>&1
Microsoft ® Incremental Linker Version 10.00.40219.01
Copyright © Microsoft Corporation. All rights reserved.
LINK : fatal error LNK1104: не удается открыть файл «test.exe»
А это уже хулиганит антивирус. Хе-хе!
Пишу в саппорт. Как я искал адрес их электронной почты, отдельная сага.
Пью кофе. Проверяю почту. Ответа нет.
Жму обновится в антивире. Но ничего нового.
Эти $@# меня проигнорировали!
Написать ещё раз и обматерить их что ли? А может они там заняты? Эх, с кем я связался-то?
Вместо того, чтобы отвечать на мои запросы, наверное бухают и секретуток зажимают поуглам.
Ладно, добавляем диск в исключение. Если словлю на него вирус, то виноват будет саппорт.
Компилю, линкую и о радость!
Ндяс. А какой смысл в этой проге?
Придётся добавлять смысл.



В любой нормальной системе, даже голой, есть эти функции. Так что могу обращатся к ним.
cl.exe /c /Od /WX /GR /Zi /Zl /EHa test.cpp /Fotest.obj > compile.log 2>&1
link.exe /debug /entry:_mainCRTStartup /subsystem:console test.obj /out:test.exe Kernel32.lib > link.txt 2>&1
Теперь запускаю и получаю:
Операция успешно завершена.
Для продолжения нажмите любую клавишу . . .
Здорово?! А вот и нет!
Небольшое усложнение, для проверки:



Компилирую, линкую и:
Microsoft ® Incremental Linker Version 10.00.40219.01
Copyright © Microsoft Corporation. All rights reserved.
test.obj : error LNK2019: ссылка на неразрешенный внешний символ ___security_cookie в функции «void __cdecl _mainCRTStartup(void)» (?_mainCRTStartup@@YAXXZ)
test.obj : error LNK2019: ссылка на неразрешенный внешний символ ___CxxFrameHandler3 в функции __ehhandler$?_mainCRTStartup@@YAXXZ
test.obj : error LNK2019: ссылка на неразрешенный внешний символ @__security_check_cookie@4 в функции __ehhandler$?_mainCRTStartup@@YAXXZ
test.obj : error LNK2001: неразрешенный внешний символ «»const type_info::`vftable’» (??_7type_info@@6B@)»
test.obj : error LNK2019: ссылка на неразрешенный внешний символ «void __cdecl operator delete(void *)» (??3@YAXPAX@Z) в функции «public: virtual void * __thiscall console_output::`scalar deleting destructor'(unsigned int)» (??_Gconsole_output@@UAEPAXI@Z)
LINK : error LNK2001: неразрешенный внешний символ «__load_config_used»
test.exe : fatal error LNK1120: 6 неразрешенных внешних элементов
Ладно, попрощаемся с ключеком «/EHa «.
Microsoft ® Incremental Linker Version 10.00.40219.01
Copyright © Microsoft Corporation. All rights reserved.
test.obj : error LNK2001: неразрешенный внешний символ «»const type_info::`vftable’» (??_7type_info@@6B@)»
test.obj : error LNK2019: ссылка на неразрешенный внешний символ «void __cdecl operator delete(void *)» (??3@YAXPAX@Z) в функции «public: virtual void * __thiscall console_output::`scalar deleting destructor'(unsigned int)» (??_Gconsole_output@@UAEPAXI@Z)
test.exe : fatal error LNK1120: 2 неразрешенных внешних элементов
А если убрать и ключик «/GR», но нет, всё то же.
Там ещё и операторы new, delete надо будет перегружать. Но это конечно не проблема.
А вот откуда и что такое это «const type_info::`vftable’» (??_7type_info@@6B@)»
Это ведь класс?
Как его перегрузить?
Где взять исходники стандартной библиотеки, чтоб поковырятся?
Ни с какими ключиками не игрался, ничего не перегружал, в исходниках RTL не копался.
Источник
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 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 |
/* ********************************************************************* * Copyright (c) 2007 VMware, Inc. * All rights not expressly granted to you by VMware, Inc. are reserved. * *********************************************************************/ /* This demonstrates how to open a virtual machine, create * a snapshot, and revert the snapshot. The virtual machine * will remain powered on at the end of this program. * * This uses the VixJob_Wait function to block after starting each * asynchronous function. This effectively makes the asynchronous * functions synchronous, because VixJob_Wait will not return until the * asynchronous function has completed. */ #include <stdio.h> #include <stdlib.h> #include "vix.h" /* * Certain arguments differ when using VIX with VMware Server 2.0 * and VMware Workstation. * * Comment out this definition to use this code with VMware Server 2.0. */ #define USE_WORKSTATION #ifdef USE_WORKSTATION #define CONNTYPE VIX_SERVICEPROVIDER_VMWARE_WORKSTATION #define HOSTNAME "" #define HOSTPORT 0 #define USERNAME "" #define PASSWORD "" #define VMPOWEROPTIONS VIX_VMPOWEROP_LAUNCH_GUI // Launches the VMware Workstaion UI // when powering on the virtual machine. #define VMXPATH_INFO "where vmxpath is an absolute path to the .vmx file " "for the virtual machine." #else // USE_WORKSTATION /* * For VMware Server 2.0 */ #define CONNTYPE VIX_SERVICEPROVIDER_VMWARE_VI_SERVER #define HOSTNAME "https://192.2.3.4:8333/sdk" /* * NOTE: HOSTPORT is ignored, so the port should be specified as part * of the URL. */ #define HOSTPORT 0 #define USERNAME "root" #define PASSWORD "hideme" #define VMPOWEROPTIONS VIX_VMPOWEROP_NORMAL #define VMXPATH_INFO "where vmxpath is a datastore-relative path to the " ".vmx file for the virtual machine, such as " ""[standard] ubuntu/ubuntu.vmx"." #endif // USE_WORKSTATION /* * Global variables. */ static char *progName; /* * Local functions. */ //////////////////////////////////////////////////////////////////////////////// static void usage() { fprintf(stderr, "Usage: %s <vmxpath>n", progName); fprintf(stderr, "%sn", VMXPATH_INFO); } //////////////////////////////////////////////////////////////////////////////// int main(int argc, char **argv) { VixError err; char *vmxPath; VixHandle hostHandle = VIX_INVALID_HANDLE; VixHandle jobHandle = VIX_INVALID_HANDLE; VixHandle vmHandle = VIX_INVALID_HANDLE; VixHandle snapshotHandle = VIX_INVALID_HANDLE; int numSnapshots; progName = argv[0]; if (argc > 1) { vmxPath = argv[1]; } else { usage(); exit(EXIT_FAILURE); } jobHandle = VixHost_Connect(VIX_API_VERSION, CONNTYPE, HOSTNAME, // *hostName, HOSTPORT, // hostPort, USERNAME, // *userName, PASSWORD, // *password, 0, // options, VIX_INVALID_HANDLE, // propertyListHandle, NULL, // *callbackProc, NULL); // *clientData); err = VixJob_Wait(jobHandle, VIX_PROPERTY_JOB_RESULT_HANDLE, &hostHandle, VIX_PROPERTY_NONE); if (VIX_FAILED(err)) { goto abort; } Vix_ReleaseHandle(jobHandle); jobHandle = VixVM_Open(hostHandle, vmxPath, NULL, // VixEventProc *callbackProc, NULL); // void *clientData); err = VixJob_Wait(jobHandle, VIX_PROPERTY_JOB_RESULT_HANDLE, &vmHandle, VIX_PROPERTY_NONE); if (VIX_FAILED(err)) { goto abort; } Vix_ReleaseHandle(jobHandle); err = VixVM_GetNumRootSnapshots(vmHandle, &numSnapshots); if (VIX_FAILED(err)) { goto abort; } if (numSnapshots == 0) { /* * If there is not already a snapshot, create a new one, with the * virtual machine powered on. */ jobHandle = VixVM_PowerOn(vmHandle, VMPOWEROPTIONS, VIX_INVALID_HANDLE, NULL, // *callbackProc, NULL); // *clientData); err = VixJob_Wait(jobHandle, VIX_PROPERTY_NONE); if (VIX_FAILED(err)) { goto abort; } Vix_ReleaseHandle(jobHandle); /* * Since the virtual machine is running, passing the * VIX_SNAPSHOT_INCLUDE_MEMORY flag will make VixVM_CreateSnapshot() * save the run-time state of the machine, and not just the disk state. */ jobHandle = VixVM_CreateSnapshot(vmHandle, "snapshotName", "snapshotDescription", VIX_SNAPSHOT_INCLUDE_MEMORY, VIX_INVALID_HANDLE, NULL, // *callbackProc, NULL); // *clientData); err = VixJob_Wait(jobHandle, VIX_PROPERTY_JOB_RESULT_HANDLE, &snapshotHandle, VIX_PROPERTY_NONE); if (VIX_FAILED(err)) { goto abort; } Vix_ReleaseHandle(jobHandle); jobHandle = VixVM_PowerOff(vmHandle, VIX_VMPOWEROP_NORMAL, NULL, // *callbackProc, NULL); // *clientData); err = VixJob_Wait(jobHandle, VIX_PROPERTY_NONE); if (VIX_FAILED(err)) { goto abort; } Vix_ReleaseHandle(jobHandle); /* * Release the handle before it gets overwritten when we call * VixVM_GetRootSnapshot(). */ Vix_ReleaseHandle(snapshotHandle); snapshotHandle = VIX_INVALID_HANDLE; } err = VixVM_GetRootSnapshot(vmHandle, 0, &snapshotHandle); if (VIX_FAILED(err)) { goto abort; } /* * Here we pass VMPOWEROPTIONS to RevertToSnapshot since we * took a snapshot of a powered on virtual machine, and the * virtual machine will then be powered on again when we revert. */ jobHandle = VixVM_RevertToSnapshot(vmHandle, snapshotHandle, VMPOWEROPTIONS, // options, VIX_INVALID_HANDLE, NULL, // *callbackProc, NULL); // *clientData); err = VixJob_Wait(jobHandle, VIX_PROPERTY_NONE); if (VIX_FAILED(err)) { goto abort; } abort: Vix_ReleaseHandle(jobHandle); Vix_ReleaseHandle(vmHandle); Vix_ReleaseHandle(snapshotHandle); VixHost_Disconnect(hostHandle); return 0; } |




