/* dclick.cpp * by Derek Bruening * May 2002 * * equivalent of DOS shell "start" command: launches a file using the * shell as though it were double-clicked in explorer * * to build, must link in shell32.lib: * cl /nologo dclick.cpp shell32.lib */ /* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. */ #include #include #include #include int main(int argc, char *argv[]) { if (argc < 2) { fprintf(stderr, "Usage: %s \n", argv[0]); return 1; } TCHAR cwd[MAX_PATH]; int cwd_res = GetCurrentDirectory(MAX_PATH, cwd); assert(cwd_res > 0); TCHAR *params = (TCHAR *) malloc(sizeof(TCHAR) * (argc-1) * MAX_PATH); TCHAR *cur = params; int i; int len, left = (argc-1) * MAX_PATH; for (i = 2; i < argc; i++) { len = _sntprintf(cur, left, "%s ", argv[i]); if (len < 0) { /* hit max */ cur += left - 1; fprintf(stderr, "Warning: hit parameter buffer limit\n"); break; } left -= len; cur += len; } *cur = _T('\0'); fprintf(stderr, "Opening \"%s\" with parameters \"%s\"\n", argv[1], params); // tell explorer to "open" the file HINSTANCE res = ShellExecute(NULL, _T("open"), argv[1], (LPCTSTR) params, cwd, SW_SHOWNORMAL); free(params); if ((int)res <= 32) { int errnum = GetLastError(); LPVOID lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errnum, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) &lpMsgBuf, 0, NULL); // Display the string. fprintf(stderr, "Error opening \"%s\":\n\t%s\n", argv[1], lpMsgBuf); // Free the buffer. LocalFree(lpMsgBuf); return 1; } return 0; }