Just had the same problem I have ps2pdf.prg. this has a function called "runme"
I don’t know who the author is...sorry *:****************************************************************************** *: *: Procedure File PS2PDF.PRG *: *: Documented using Visual FoxPro Formatting wizard version .05 *:****************************************************************************** *: PS2PDF *: clnpsfiles *: runme *: long2str *: str2long *: getStartupInfo *: num2dword *: num2word *: buf2dword *: Decl Parameters m_ifilename && checking this has to be a ps file. If m_ifilename =="" Or Not File(m_ifilename) Return Endif **Do clnpsfiles m_safety = Set("safety") Set Safety Off If Not Directory(m.cHomeDir+"psfiles") Mkdir &(m.cHomeDir+"psfiles") Endif If Not Directory(m.cHomeDir+"pdffiles") Mkdir &(m.cHomeDir+"pdffiles") Endif m_psfile= m.cHomeDir+"psfiles\"+Juststem(m_ifilename)+".ps" If File(m_psfile) ** Erase (m_psfile) Endif If Justext(m_ifilename) == "" m_ifilename = Juststem(m_ifilename)+".TXT" m_psfile=Juststem(m_ifilename)+".ps" If File(m_psfile) Erase (m_psfile) Endif Rename (m_ifilename) To m.cHomeDir+"psfiles\"+Juststem(m_ifilename)+".ps" m_ifilename = m.cHomeDir+"psfiles\"+Juststem(m_ifilename)+".ps" Endif If Justext(m_ifilename)="TXT" Rename (m_ifilename) To m.cHomeDir+"psfiles\"+Juststem(m_ifilename)+".ps" m_ifilename = m.cHomeDir+"psfiles\"+Juststem(m_ifilename)+".ps" Endif If Justext(m_ifilename)="ps" Or Justext(m_ifilename)="PS" * Rename (m_ifilename) To "psfiles\"+Juststem(m_ifilename)+".ps" * m_ifilename = "psfiles\"+Juststem(m_ifilename)+".ps" Endif gs = Filetostr(m.cHomeDir+"LocationOfgs.ini") m_outfile = m.cHomeDir+"pdffiles\"+Juststem(m_ifilename) +".pdf" m_cmd = [ -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE#pdfwrite -sOutputFile#]+m_outfile +[ -dnodisplay -dCompatibilityLevel#1.2 -c .setpdfwrite -f ] +; m_ifilename m_cmd = (gs)+ m_cmd +Chr(0) ** this is the actual ps2pdf command sent to ghostscript M_HANDLE=FCREATE("C:\GSME.BAT") FWRITE(M_HANDLE,M_CMD,LEN(M_CMD)) FCLOSE(M_HANDLE) Do runme With m_cmd Set Safety &m_safety *!****************************************************************************** *! *! Procedure CLNPSFILES *! *! Calls *! clnpsfiles *! runme *! *!****************************************************************************** Procedure clnpsfiles ** proceedure for clearing out the last ps file to be converted. ** general housekeeping m_num = Adir(m_files,m.cHomeDir+"psfiles\*.ps") If m_num > 0 m_dir = "psfiles\" For i=1 To m_num m_filetoerase =(m_dir)+m_files[i,1] Erase (m_filetoerase) Next i Endif Endproc *!****************************************************************************** *! *! Procedure RUNME *! *! Calls *! clnpsfiles *! runme *! *!****************************************************************************** Proc runme Para m_cmd #Define NORMAL_PRIORITY_CLASS 32 #Define IDLE_PRIORITY_CLASS 64 #Define HIGH_PRIORITY_CLASS 128 #Define REALTIME_PRIORITY_CLASS 1600 * Return code from WaitForSingleObject() if * it timed out. #Define WAIT_TIMEOUT 0x00000102 * This controls how long, in milli secconds, WaitForSingleObject() * waits before it times out. Change this to suit your preferences. #Define WAIT_INTERVAL 200 Declare Integer CreateProcess In kernel32.Dll ; INTEGER lpApplicationName, ; STRING lpCommandLine, ; INTEGER lpProcessAttributes, ; INTEGER lpThreadAttributes, ; INTEGER bInheritHandles, ; INTEGER dwCreationFlags, ; INTEGER lpEnvironment, ; INTEGER lpCurrentDirectory, ; STRING @lpStartupInfo, ; STRING @lpProcessInformation Declare Integer WaitForSingleObject In kernel32.Dll ; INTEGER hHandle, Integer dwMilliseconds Declare Integer CloseHandle In kernel32.Dll ; INTEGER hObject Declare Integer GetLastError In kernel32.Dll * STARTUPINFO is 68 bytes, of which we need to * initially populate the 'cb' or Count of Bytes member * with the overall length of the structure. * The remainder should be 0-filled Start = long2str(68) + Replicate(Chr(0), 64) * PROCESS_INFORMATION structure is 4 longs, * or 4*4 bytes = 16 bytes, which we'll fill with nulls. process_info = Replicate(Chr(0), 16) * Start a copy of gs (EXE name must be null-terminated) File2Run = m_cmd * Call CreateProcess, obtain a process handle. Treat the * application to run as the 'command line' argument, accept * all other defaults. Important to pass the start and * process_info by reference. lcStartupInfo = getStartupInfo() ** the older startup * I didn't want ghostscript to show, so I changed the startup * of create process to run without a visual element. * to have GS start visually, change @lcStartupInfo, below to be @start RetCode = CreateProcess(0, File2Run, 0, 0, 1, ; NORMAL_PRIORITY_CLASS , 0, 0, @lcStartupInfo, @process_info) * Unable to run, exit now. If RetCode = 0 =Messagebox("Error occurred. Error code: ", GetLastError()) Return Endif * Extract the process handle from the * PROCESS_INFORMATION structure. hProcess = str2long(Substr(process_info, 1, 4)) Do While .T. * Use timeout of TIMEOUT_INTERVAL msec so the display * will be updated. Otherwise, the VFP window never repaints until * the loop is exited. If WaitForSingleObject(hProcess, WAIT_INTERVAL) != WAIT_TIMEOUT Exit Else DoEvents Endif Enddo * Show a message box when we're done. *This was removed to enable it run without user intervention. * ie. a web web server * =MESSAGEBOX ("Process completed") * Close the process handle afterwards. RetCode = CloseHandle(hProcess) Return ******************** *!****************************************************************************** *! *! Procedure LONG2STR *! *! Calls *! clnpsfiles *! runme *! *!****************************************************************************** Function long2str ******************** * Passed : 32-bit non-negative numeric value (m.longval) * Returns : ASCII character representation of passed * value in low-high format (m.retstr) * Example : * m.long = 999999 * m.longstr = long2str(m.long) Parameters m.longval Private i, m.retstr m.retstr = "" For i = 24 To 0 Step -8 m.retstr = Chr(Int(m.longval/(2^i))) + m.retstr m.longval = Mod(m.longval, (2^i)) Next Return m.retstr ******************* *!****************************************************************************** *! *! Procedure STR2LONG *! *! Calls *! clnpsfiles *! runme *! *!****************************************************************************** Function str2long ******************* * Passed: 4-byte character string (m.longstr) * in low-high ASCII format * returns: long integer value * example: * m.longstr = "1111" * m.longval = str2long(m.longstr) Parameters m.longstr Private i, m.retval m.retval = 0 For i = 0 To 24 Step 8 m.retval = m.retval + (Asc(m.longstr) * (2^i)) m.longstr = Right(m.longstr, Len(m.longstr) - 1) Next Return m.retval Endpro *!****************************************************************************** *! *! Procedure GETSTARTUPINFO *! *! Calls *! clnpsfiles *! runme *! *!****************************************************************************** Procedure getStartupInfo * creates the STARTUP structure to specify main window * properties if a new window is created for a new process *| typedef struct _STARTUPINFO { *| DWORD cb; 4 *| LPTSTR lpReserved; 4 *| LPTSTR lpDesktop; 4 *| LPTSTR lpTitle; 4 *| DWORD dwX; 4 *| DWORD dwY; 4 *| DWORD dwXSize; 4 *| DWORD dwYSize; 4 *| DWORD dwXCountChars; 4 *| DWORD dwYCountChars; 4 *| DWORD dwFillAttribute; 4 *| DWORD dwFlags; 4 *| WORD wShowWindow; 4 *| WORD cbReserved2; 2 *| LPBYTE lpReserved2; 4 *| HANDLE hStdInput; 4 *| HANDLE hStdOutput; 4 *| HANDLE hStdError; 4 *| } STARTUPINFO, *LPSTARTUPINFO; total: 68 bytes #Define STARTF_USESHOWWINDOW 1 #Define SW_SHOWMAXIMIZED 2 Return num2dword(68) +; num2dword(0) + num2dword(0) + num2dword(0) +; num2dword(0) + num2dword(0) + num2dword(0) + num2dword(0) +; num2dword(0) + num2dword(0) + num2dword(0) +; num2dword(STARTF_USESHOWWINDOW) +; num2word(SW_SHOWMAXIMIZED) +; num2word(0) + num2dword(0) +; num2dword(0) + num2dword(0) + num2dword(0) *!****************************************************************************** *! *! Procedure NUM2DWORD *! *! Calls *! clnpsfiles *! runme *! *!****************************************************************************** Function num2dword (lnValue) #Define m0 256 #Define m1 65536 #Define m2 16777216 Local b0, b1, b2, b3 b3 = Int(lnValue/m2) b2 = Int((lnValue - b3 * m2)/m1) b1 = Int((lnValue - b3*m2 - b2*m1)/m0) b0 = Mod(lnValue, m0) Return Chr(b0)+Chr(b1)+Chr(b2)+Chr(b3) *!****************************************************************************** *! *! Procedure NUM2WORD *! *! Calls *! clnpsfiles *! runme *! *!****************************************************************************** Function num2word (lnValue) Return Chr(Mod(m.lnValue,256)) + Chr(Int(m.lnValue/256)) *!****************************************************************************** *! *! Procedure BUF2DWORD *! *! Calls *! clnpsfiles *! runme *! *!****************************************************************************** Function buf2dword (lcBuffer) Return Asc(Substr(lcBuffer, 1,1)) + ; Asc(Substr(lcBuffer, 2,1)) * 256 +; Asc(Substr(lcBuffer, 3,1)) * 65536 +; Asc(Substr(lcBuffer, 4,1)) * 16777216 *!****************************************************************************** *! *! Procedure DECL *! *! Calls *! clnpsfiles *! runme *! *!****************************************************************************** Procedure Decl Declare Integer GetLastError In kernel32 Declare Integer CreateProcess In kernel32; STRING lpApplicationName, String lpCommandLine,; INTEGER lpProcessAttributes,; INTEGER lpThreadAttributes,; INTEGER bInheritHandles, Integer dwCreationFlags,; INTEGER @ lpEnvironment, String lpCurrentDirectory,; STRING lpStartupInfo, String @ lpProcessInformation Declare Integer GetModuleHandle In kernel32 Integer lpModuleName Declare Integer GetCurrentProcessId In kernel32 Declare Integer GetCurrentThreadId In kernel32 Declare Integer GetCurrentProcess In kernel32 Declare Integer GetCurrentThread In kernel32 Declare Integer TerminateProcess In kernel32; INTEGER hProcess, Integer uExitCode endpro _______________________________________________ Post Messages to: ProFox@leafe.com Subscription Maintenance: https://mail.leafe.com/mailman/listinfo/profox OT-free version of this list: https://mail.leafe.com/mailman/listinfo/profoxtech Searchable Archive: https://leafe.com/archives This message: https://leafe.com/archives/byMID/003b01d98278$e2cc5a70$a8650f50$@compsys.co.uk ** All postings, unless explicitly stated otherwise, are the opinions of the author, and do not constitute legal or medical advice. This statement is added to the messages for those lawyers who are too stupid to see the obvious.