#include #include #include #include int __cdecl main(int ,char *argv[]); void ShowHelp(void); int DoesFileExist(char *input_filespec); int ProcessFile(char szTheFileName[]); DWORD CallProcedureInDll(LPCTSTR lpszDLLFile, LPCTSTR lpszProcedureToCall, BOOL bInitOleFlag); int g_Param_A = FALSE; int g_Param_B = FALSE; //------------------------------------------------------------------- // purpose: main //------------------------------------------------------------------- int __cdecl main(int argc,char *argv[]) { int argno; int nflags=0; char szTempFileName1[_MAX_PATH]; char szTempFileName2[_MAX_PATH]; int iLen = 0; szTempFileName1[0] = '\0'; szTempFileName2[0] = '\0'; // process command line arguments for(argno=1; argno \n"); return; } //------------------------------------------------------------------- // purpose: //------------------------------------------------------------------- int DoesFileExist(char *input_filespec) { if (GetFileAttributes(input_filespec) == -1) {return(FALSE);} return (TRUE); } BOOL IsFileExist(LPCTSTR szFile) { // Check if the file has expandable Environment strings LPTSTR pch = NULL; pch = _tcschr( (LPTSTR) szFile, _T('%')); if (pch) { TCHAR szValue[_MAX_PATH]; _tcscpy(szValue,szFile); if (!ExpandEnvironmentStrings( (LPCTSTR)szFile, szValue, sizeof(szValue)/sizeof(TCHAR))) {_tcscpy(szValue,szFile);} return (GetFileAttributes(szValue) != 0xFFFFFFFF); } else { return (GetFileAttributes(szFile) != 0xFFFFFFFF); } } int iOleInitialize(void) { int iBalanceOLE = FALSE; HRESULT hInitRes = NULL; hInitRes = OleInitialize(NULL); if ( SUCCEEDED(hInitRes) || hInitRes == RPC_E_CHANGED_MODE ) { if ( SUCCEEDED(hInitRes)) { iBalanceOLE = TRUE; } else { _tprintf("iOleInitialize failed 1\n"); } } else { _tprintf("iOleInitialize failed 2\n"); } return iBalanceOLE; } void iOleUnInitialize(int iBalanceOLE) { if (iBalanceOLE) { OleUninitialize(); } return; } void InetGetFilePath(LPCTSTR szFile, LPTSTR szPath) { // if UNC name \\computer\share\local1\local2 if (*szFile == _T('\\') && *(_tcsinc(szFile)) == _T('\\')) { TCHAR szTemp[_MAX_PATH], szLocal[_MAX_PATH]; TCHAR *p = NULL; int i = 0; _tcscpy(szTemp, szFile); p = szTemp; while (*p) { if (*p == _T('\\')) i++; if (i == 4) { *p = _T('\0'); p = _tcsinc(p); // p is now pointing at local1\local2 break; } p = _tcsinc(p); } _tcscpy(szPath, szTemp); // now szPath contains \\computer\share if (i == 4 && *p) { // p is pointing the local path now _tcscpy(szLocal, p); p = _tcsrchr(szLocal, _T('\\')); if (p) *p = _T('\0'); _tcscat(szPath, _T("\\")); _tcscat(szPath, szLocal); // szPath contains \\computer\share\local1 } } else { // NOT UNC name TCHAR *p; if (GetFullPathName(szFile, _MAX_PATH, szPath, &p)) { p = _tcsrchr(szPath, _T('\\')); if (p) { TCHAR *p2 = NULL; p2 = _tcsdec(szPath, p); if (p2) { if (*p2 == _T(':') ) {p = _tcsinc(p);} } *p = _T('\0'); } } else { _tprintf("InetGetFilePath failed\n"); } } return; } typedef HRESULT (CALLBACK *HCRET)(void); DWORD CallProcedureInDll(LPCTSTR lpszDLLFile, LPCTSTR lpszProcedureToCall, BOOL bInitOleFlag) { TCHAR szErrorString[100]; DWORD dwReturn = ERROR_SUCCESS; HINSTANCE hDll = NULL; // Diferent function prototypes... HCRET hProc = NULL; int iTempProcGood = FALSE; HRESULT hRes = 0; BOOL bBalanceOLE = FALSE; HRESULT hInitRes = NULL; int err = NOERROR; // Variables to changing and saving dirs TCHAR szDirName[_MAX_PATH], szFilePath[_MAX_PATH]; // Variable to set error string TCHAR szErrString[256]; _tcscpy(szDirName, _T("")); _tcscpy(szErrString, _T("")); _tprintf("CallProcedureInDll start\n"); // If we need to initialize the ole library then init it. if (bInitOleFlag) { bBalanceOLE = iOleInitialize(); if (FALSE == bBalanceOLE) { hInitRes = OleInitialize(NULL); // Ole Failed. dwReturn = hInitRes; SetLastError(dwReturn); _tprintf("CallProcedureInDll failed 1\n"); goto CallProcedureInDll_Exit; } } // Check if the file exists if (!IsFileExist(lpszDLLFile)) { dwReturn = ERROR_FILE_NOT_FOUND; _tprintf("CallProcedureInDll failed 2\n"); SetLastError(dwReturn); goto CallProcedureInDll_Exit; } // Change Directory GetCurrentDirectory( _MAX_PATH, szDirName ); InetGetFilePath(lpszDLLFile, szFilePath); // Change to The Drive. if (SetCurrentDirectory(szFilePath) == 0) {} // Try to load the module,dll,ocx. hDll = LoadLibraryEx(lpszDLLFile, NULL, LOAD_WITH_ALTERED_SEARCH_PATH ); if (!hDll) { // Failed to load library, Probably because some .dll file is missing. // Show the error message. dwReturn = TYPE_E_CANTLOADLIBRARY; _tprintf("CallProcedureInDll failed 3\n"); SetLastError(dwReturn); goto CallProcedureInDll_Exit; } // Ok module was successfully loaded. now let's try to get the Address of the Procedure // Convert the function name to ascii before passing it to GetProcAddress() char AsciiProcedureName[255]; #if defined(UNICODE) || defined(_UNICODE) // convert to ascii WideCharToMultiByte( CP_ACP, 0, (TCHAR *)lpszProcedureToCall, -1, AsciiProcedureName, 255, NULL, NULL ); #else // the is already ascii so just copy strcpy(AsciiProcedureName, lpszProcedureToCall); #endif iTempProcGood = TRUE; hProc = (HCRET)GetProcAddress(hDll, AsciiProcedureName); if (!hProc){iTempProcGood = FALSE;} if (!iTempProcGood) { // failed to load,find or whatever this function. dwReturn = ERROR_PROC_NOT_FOUND; _tprintf("CallProcedureInDll failed 4\n"); SetLastError(dwReturn); goto CallProcedureInDll_Exit; } // Call the function that we got the handle to __try { hRes = (*hProc)(); } __except(EXCEPTION_EXECUTE_HANDLER) { _tprintf(szErrorString, _T("\r\n\r\nException Caught in CallProcedureInDll(). GetExceptionCode()=0x%x.\r\n\r\n"), GetExceptionCode()); _tprintf(szErrorString); } if (FAILED(hRes)) { dwReturn = E_FAIL; _tprintf("CallProcedureInDll failed 5\n"); // this function returns E_FAIL but // the actual error is in GetLastError() // set the last error to whatever was returned from the function call SetLastError(hRes); } else { } CallProcedureInDll_Exit: if (hDll) { FreeLibrary(hDll); } else { } if (_tcscmp(szDirName, _T("")) != 0){SetCurrentDirectory(szDirName);} // To close the library gracefully, each successful call to OleInitialize, // including those that return S_FALSE, must be balanced by a corresponding // call to the OleUninitialize function. iOleUnInitialize(bBalanceOLE); return dwReturn; }