Undefined reference, linker error

I am an absolute beginner. This is my first C++ code. Taking from the default project in Dev C++, youtube tutorials, and some intuition, I came up with the simple code below. I know the answer is going to be easy. I just can't seem to paste together answers from other posts the fix for mine. I know this is an easy fix for a person with any experience coding. Any help you provide is GREATLY appreciated!!!

I get "undefined reference to CreateProcessWithLogonW" error.

#include <windows.h>


/* Declare Windows procedure */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

HWND textfield;


/* Make the class name into a global variable */
char szClassName[ ] = "WindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil)

{
HWND hwnd; /* This is the handle for our window */
MSG messages; /* Here messages to the application are saved */
WNDCLASSEX wincl; /* Data structure for the windowclass */

/* The Window structure */
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */
wincl.style = CS_DBLCLKS; /* Catch double-clicks */
wincl.cbSize = sizeof (WNDCLASSEX);

/* Use default icon and mouse-pointer */
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL; /* No menu */
wincl.cbClsExtra = 0; /* No extra bytes after the window class */
wincl.cbWndExtra = 0; /* structure or the window instance */
/* Use Windows's default color as the background of the window */
wincl.hbrBackground = GetSysColorBrush (COLOR_3DFACE);

/* Register the window class, and if it fails quit the program */
if (!RegisterClassEx (&wincl))
return 0;

/* The class is registered, let's create the program*/
hwnd = CreateWindowEx (
0, /* Extended possibilites for variation */
szClassName, /* Classname */
"Files open on Mars",/* Title Text */
WS_SYSMENU, /* default window */
CW_USEDEFAULT, /* Windows decides the position */
CW_USEDEFAULT, /* where the window ends up on the screen */
444, /* The programs width */
175, /* and height in pixels */
HWND_DESKTOP, /* The window is a child-window to desktop */
NULL, /* No menu */
hThisInstance, /* Program Instance handler */
NULL /* No Window Creation data */
);

/* Make the window visible on the screen */
ShowWindow (hwnd, nFunsterStil);

/* Run the message loop. It will run until GetMessage() returns 0 */
while (GetMessage (&messages, NULL, 0, 0))
{
/* Translate virtual-key messages into character messages */
TranslateMessage(&messages);
/* Send message to WindowProcedure */
DispatchMessage(&messages);
}

/* The program return-value is 0 - The value that PostQuitMessage() gave */
return messages.wParam;
}


/* This function is called by the Windows function DispatchMessage() */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) /* handle the messages */
{

case WM_CREATE:

CreateWindow(TEXT("button"), TEXT("Open files"),
WS_VISIBLE | WS_CHILD,
10,10,80,25,
hwnd, (HMENU) 1, NULL, NULL
);

textfield = CreateWindow("STATIC",
"Please click the button to retrieve a list of open files on server",
WS_VISIBLE | WS_CHILD,
10,50,400,25, hwnd, NULL, NULL, NULL);

textfield = CreateWindow("STATIC",
"Message at bottom of box",
WS_VISIBLE | WS_CHILD,
10,120,400,25, hwnd, NULL, NULL, NULL);

break;

case WM_COMMAND:

if (LOWORD(wParam) == 1) {


CreateProcessWithLogonW(L"me", L"company", L"xxxxxx", 0, 0, L"c:\\files.cmd", 0, NULL, NULL, NULL, NULL);
MessageBox(hwnd, "A text file with all of the open files has been placed on your desktop", "Open Files", MB_OK | MB_ICONINFORMATION);

}



break;

case WM_DESTROY:
PostQuitMessage (0); /* send a WM_QUIT to the message queue */
break;
default: /* for messages that we don't deal with */
return DefWindowProc (hwnd, message, wParam, lParam);
}

return 0;
}
paste code in brackets <>.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682431%28v=vs.85%29.aspx says that CreateProcessWithLogonW require WinBase.h header and Advapi32.lib or Advapi32.dll.

Since dev c++ (use free Visual Studio 2013 Express which is waaaay better) doesn't do this automatically, you must add this lib file by hand to your project ( "dev c++ how to add library" in google).
Thank you tath! May God bless you and your family.
When you write a program using an API, such as WIN32, you always have to tell the Linker where to find that function you are using since it is not one that you personally wrote.

Microsoft of course wants that code to stay secure so people don't copy it easily (by just reading the high level code). Therefore they break it into two parts (for other reasons as well). An interface and implementation. For you the interface is located in the WinBase.h header file which in your case was added when you wrote

#include <Windows.h>

By including the interface in your project you are saying there is some function out there called CreateProcessWithLogonW. But if you try to build your project by just mentioning the interface you will have problems. The reason is that you only said that this functions does exist. You did no write it and therefore have to make sure you give the location of the actual implementation of the code that the interface describes.

To do this we have step two. You must tell something called the Linker where the heck this code can be found. So where can this code be found? In the library Advapi32 for your particular case. We include a library in the project by making sure the Linker can find this library and that just depends on your setup (different IDE's use different ways).

So basically when you added the interface part the compiler said,

"Ok, I see that this function CreateProcessWithLogonW exists"

but you never told the Linker where the heck it is and therefore you get the

"unknown reference"

By adding the library to the project and linking it you will see this error go away because the Linker will say

"Hey dude! I know where this function implementation is!"

I know there was already an answer but I hope this explanation might help with the overall idea of what went wrong in general.

If you need specific help with Dev-C++ linking feel free to ask for some help it you get lost in the documentationl

Cheers!
Topic archived. No new replies allowed.