/* * PURPOSE: Load a DLL and run an entry point with the specified parameters * * Copyright 2002 Alberto Massari * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ /* * * rundll32 dllname,entrypoint [arguments] * * Documentation for this utility found on KB Q164787 * */ /** * FIXME - currently receives command-line parameters in ASCII only and later * converts to Unicode. Ideally the function should have wWinMain entry point * and then work in Unicode only, but it seems Wine does not have necessary * support. */ #include "config.h" #include "wine/port.h" #include #include #include typedef void (*EntryPointW) (HWND hWnd, HINSTANCE hInst, LPWSTR lpszCmdLine, int nCmdShow); typedef void (*EntryPointA) (HWND hWnd, HINSTANCE hInst, LPSTR lpszCmdLine, int nCmdShow); /** * Loads procedure. * * Parameters: * strDll - name of the dll. * procName - name of the procedure to load from dll * pDllHanlde - output variable receives handle of the loaded dll. */ static FARPROC LoadProc(char* strDll, char* procName, HMODULE* DllHandle) { FARPROC proc; *DllHandle = LoadLibrary(strDll); if(!*DllHandle) { exit(-1); } proc = GetProcAddress(*DllHandle, procName); if(!proc) { FreeLibrary(*DllHandle); return NULL; } return proc; } int main(int argc, char* argv[]) { char szDllName[MAX_PATH],szEntryPoint[64],szCmdLine[2048]; char* comma; EntryPointW pfEntryPointW; EntryPointA pfEntryPointA; HMODULE DllHandle=NULL; if(argc<2) return 0; comma=strchr(argv[1],','); if(comma==NULL) return 0; /* Extract the name of the DLL */ memset(szDllName,0,MAX_PATH); strncpy(szDllName,argv[1],(comma-argv[1])); /* Merge the other paramters into one big command line */ memset(szCmdLine,0,2048); if(argc>2) { int i; for(i=2;i