Years ago, we used a function in the FUNCKY32 dll library to delete files (fEraseAll). While our app was compiled in PB 11.5, we deprecated use of FUNCKY32 and replaced fEraseAll with a WinAPI global function. It worked fine in 11.5 and 12.5, but crashes the app in PB 2017 R2. Specifically, it fails on ZeroMemory( lpFileOp, 30 ) after several calls to the function. I submitted this to Appeon as a bug, but wanted to see if anyone on the forum has an insight.
Below are code snippets showing the external definitions, the function we call (of_filedelete) and sample calls. Does anyone see a problem with the setup?
SUBROUTINE ZeroMemory(REF structure lpVoid, ulong dwSizeofStruct ) LIBRARY "kernel32.dll" ALIAS FOR "RtlZeroMemory;Ansi"
function long SHFileOperationA( REF str_SHFILEOPSTRUCT lpFileOp ) LIBRARY "SHELL32.DLL" alias for "SHFileOperationA;Ansi"
// File operation types
CONSTANT uint FO_DELETE = 3
// File operation flags
CONSTANT uint FOF_SILENT = 4
CONSTANT uint FOF_NOCONFIRMATION = 16
CONSTANT uint FOF_FILESONLY = 128
CONSTANT uint FOF_NOERRORUI = 1024
global type str_shfileopstruct from structure
unsignedlong hwnd
unsignedlong wfunc
blob pfrom
blob pto
unsignedinteger fflags
unsignedlong banyoperationsaborted
unsignedlong hnamemappings
string lpszprogresstitle
end type
public function integer of_filedelete (long al_handle, string as_sourcefile, unsignedinteger ai_flags);
try
Integer li_rc
str_shfileopstruct lpFileOp
ZeroMemory( lpFileOp, 30 )
lpFileOp.hWnd = al_handle
lpFileOp.wFunc = FO_DELETE
lpFileOp.pFrom = Blob( as_SourceFile + Space(2), EncodingANSI! )
BlobEdit( lpFileOp.pFrom, Len( as_sourcefile ) + 1, Char(0), EncodingANSI!)
BlobEdit( lpFileOp.pFrom, Len( as_sourcefile ) + 2, Char(0), EncodingANSI!)
lpFileOp.fFlags = ai_flags
lpFileOp.hNameMappings = 0
lpFileOp.lpszProgressTitle = Space( 10 )
li_rc = SHFileOperationA( lpFileOp )
IF lpFileOp.bAnyOperationsAborted = 1 THEN
RETURN -1
ELSEIF li_rc <> 0 THEN
RETURN -1
ELSE
RETURN 1
END IF
catch (runtimeerror er_runtime)
end try
end function
Sample calls. (this) is a window or user object.
ls_delete = gnv_app.is_tempfolder + "\esdoc*.*" // .pcl, .prn, .tif, .co, .pdf
of_filedelete(handle(this),ls_delete,FOF_NOCONFIRMATION + FOF_SILENT + FOF_NOERRORUI + FOF_FILESONLY)
ls_delete = gnv_app.is_tempfolder + "\escvr*.*" // .pcl, .prn, .tif, .pdf
of_filedelete(handle(this),ls_delete,FOF_NOCONFIRMATION + FOF_SILENT + FOF_NOERRORUI + FOF_FILESONLY)
ls_delete = gnv_app.is_tempfolder + "\rtf*.*"
of_filedelete(handle(this),ls_delete,FOF_NOCONFIRMATION + FOF_SILENT + FOF_NOERRORUI + FOF_FILESONLY)
ls_delete = gnv_app.is_tempfolder + "\esgroup*.*"
of_filedelete(handle(this),ls_delete,FOF_NOCONFIRMATION + FOF_SILENT + FOF_NOERRORUI + FOF_FILESONLY)
Thanks,
Don Olliver
We are using this method because it supports multiple file deletion using wildcards.
Thanks,
Don
How about just shelling out to the O/S and run a standard DOS command, as follows ...
RUN ("del *.mp4 /Q") // example
Regards ... Chris