Prev: UNICODE + listing files
Next: U++ 2232 released
From: Jimbo on 16 Mar 2010 04:10 Hello I have a win32 c++ application which wont compile because of 2 functions: PathAppend() & PathFileExists(). I am using dev c++ as the editor I get the error: [quote] [Linker error] undefined reference to '_imp_PathFileExistsA@4' [Linker error] undefined reference to '_imp_PathAppendA@8' Id returned 1 exit status [Build error] ["Find] Error 1 [/quote] I recently had a virus & had to erase everything from my hard drive do you think I dont have the library [b]#include "Shlwapi.h"[/b] which is the library I need to use the two functions, or is it a different problem? If its the #include "Shlwapi.h" problem, could you suggest how I get the libary & where I put it in my C://devcpp folder? How do I get the shlwapi.lib WITHOUT downloading the whole SDK from Microsoft? My full code: [source lang="cpp"] #include <windows.h> #include <iostream> #include <stdio.h> #include <fstream> #include <vector> #include <string> #include <cstdlib> #include "Shlwapi.h" // necessary for PathFileExists() #include <shlobj.h> // necessary for SHGetFolderPath() using namespace std; #define ID_FOLDERPATH1 1 #define ID_FOLDERPATH2 2 #define ID_FOLDERPATH3 3 #define ID_GETPATH 4 static HINSTANCE gInstance; UINT controlMsgs[] = {ID_FOLDERPATH1,ID_FOLDERPATH2,ID_FOLDERPATH3}; // Functions List // LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); void displayRecentPaths(HWND hwnd, UINT controlMsg[]); void recordRecentPaths(HWND hwnd, UINT controlMsg[]); string getFolderPath(HWND hwnd); vector<string> readFile(string fileName); void writeFile(string fileName, vector<string> content); int WINAPI WinMain(HINSTANCE gInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wc; HWND hwnd; MSG Msg; //Step 1: Registering the Window Class wc.cbSize = sizeof(WNDCLASSEX); wc.style = 0; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = gInstance; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(DKGRAY_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = "My Class"; wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); // if registration of main class fails if(!RegisterClassEx(&wc)) { MessageBox(NULL, "Window Registration Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK); return 0; } // Step 2: Creating the Window hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, "My Class", "Find Application Data", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 600, 500, NULL, NULL, gInstance, NULL); if(hwnd == NULL) { MessageBox(NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK); return 0; } ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); // Step 3: The Message Loop while(GetMessage(&Msg, NULL, 0, 0) > 0) { TranslateMessage(&Msg); DispatchMessage(&Msg); } return Msg.wParam; } // Step 4: the Window Procedure LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_CREATE: { HWND hEdit = CreateWindowEx(0,"Edit","path captured here...",WS_VISIBLE|WS_CHILD|WS_BORDER|ES_AUTOHSCROLL, 10,10,170,20,hwnd, (HMENU)ID_FOLDERPATH1,gInstance,NULL); HWND hEdit1 = CreateWindowEx(0,"Edit","path captured here...",WS_VISIBLE|WS_CHILD|WS_BORDER|ES_AUTOHSCROLL, 10,35,170,20,hwnd, (HMENU)ID_FOLDERPATH2,gInstance,NULL); HWND hEdit2 = CreateWindowEx(0,"Edit","path captured here...",WS_VISIBLE|WS_CHILD|WS_BORDER|ES_AUTOHSCROLL, 10,60,170,20,hwnd, (HMENU)ID_FOLDERPATH3,gInstance,NULL); HWND hButton = CreateWindowEx(0,"Button","Random",WS_VISIBLE|WS_CHILD|WS_BORDER| BS_PUSHBUTTON, 60,85,120,20,hwnd, (HMENU)ID_GETPATH,gInstance,NULL); } break; case WM_COMMAND: { switch (LOWORD(wParam)) { case ID_GETPATH: { // Find the local computers path to the APP DATA folder regardless of // of which version of windows the local system is using string folderPath; if( SHGetFolderPath(NULL,CSIDL_APPDATA,NULL, 0,(LPTSTR)folderPath.c_str()) == S_OK ) { HWND hEdit = GetDlgItem(hwnd,ID_FOLDERPATH1); SetWindowText(hEdit,folderPath.c_str()); // The below uses the APP DATA path create & store a file in it. // PathAppend(szPath, TEXT("New Doc.txt")); // HANDLE hFile = CreateFile(szPath, ...); } } break; default: break; } } break; case WM_CLOSE: DestroyWindow(hwnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, msg, wParam, lParam); break; } } void displayRecentPaths(HWND hwnd,UINT controlMsg[]) { // Post: Read data file for most recent directories accessed. If data file doesn't exist // then we create it. string appDataFile = getFolderPath(hwnd); // get file path // if APP DATA file exists: write paths to text file; ELSE create APP DATA file if (PathFileExists((LPTSTR)appDataFile.c_str()) == true) { vector <string> paths = readFile(appDataFile); // display most recent accessed directories in edit boxes for (int i=0; i<paths.size(); i++) { HWND hEdit = GetDlgItem(hwnd,controlMsg[i]); SetWindowText(hEdit,(LPTSTR)paths.at(i).c_str()); } paths.clear(); // erase paths data (VERY IMPORTANT) } else { //HANDLE hFile = CreateFile((LPTSTR)appDataFile.c_str(), ...); // create file } } void recordRecentPaths(HWND hwnd, UINT controlMsg[]) { // Post: Saves the most recent folder directories accessed by application HWND hEdit; vector<string>paths; // SHOULD BE GLOBAL // Get folder paths for (int i=0; i<3; i++) { int len = GetWindowTextLength(GetDlgItem(hwnd,controlMsg[i])); // if window has text in it if (len > 0) { char buffer[len+2]; GetDlgItemText(hwnd,controlMsg[i],buffer,sizeof(buffer)); paths.push_back((string)buffer); } } string appDataFile; // = getFolderPath; // Save paths to folder if (paths.size() > 0) { writeFile(appDataFile,paths); } } string getFolderPath(HWND hwnd) { // Post: Returns the path to specified folder string folderPath; if( SHGetFolderPath(NULL,CSIDL_APPDATA,NULL,0, (LPTSTR)folderPath.c_str()) == S_OK ) { PathAppend((LPTSTR)folderPath.c_str(), ("RandomPlaylistPathData.txt")); return folderPath; } else { MessageBox(hwnd,"Failed to retrieve path to APP DATA folder","Error",MB_OK|MB_ICONERROR); } } vector<string> readFile(string fileName) { // Post: Reads a file & stores contents line by line in vector ifstream infile; vector<string> result; // vector to store contents of file in string tempStr; infile.open(fileName.c_str()); if (!infile) { MessageBox(NULL,"Failed to read randomPlaylistPathData.txt file","Error", MB_OK|MB_ICONERROR); } while (!infile.eof()) { getline(infile,tempStr,'\n'); result.push_back(tempStr); } infile.close(); return result; } void writeFile(string fileName, vector<string> content) { // Post: Write vector to text file(fileName) line by line ofstream outfile; outfile.open((LPTSTR)fileName.c_str()); if (!outfile) { MessageBox(NULL,"Failed to write to randomPlaylistPathData.txt file","Error", MB_OK|MB_ICONERROR); } for (int i=0; i<content.size(); i++) { outfile << content.at(i) << "\n"; } outfile.close(); } [/source]
|
Pages: 1 Prev: UNICODE + listing files Next: U++ 2232 released |