1. Don Olliver
  2. PowerBuilder
  3. Friday, 04 May 2018

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
Roland Smith Accepted Answer Pending Moderation
0
Votes
Undo

You have way over complicated things.

You can just use the built in FileDelete function. If you insist on using the API function, the proper one is:

Function boolean DeleteFile(string lpFileName) Library "kernel32.dll" Alias For "DeleteFileW​"

 

Comment
Roland,



We are using this method because it supports multiple file deletion using wildcards.



Thanks,



Don

  1. Don Olliver
  2. Monday, 7 May 2018
There are no comments made yet.
  1. Friday, 4 May 2018
  2. PowerBuilder
  3. # 1
Chris Pollach Accepted Answer Pending Moderation
0
Votes
Undo

Hi Don;

  The old Funcky definitions are probably getting long out-of-date MS-Windows API wise.

  •   Why not just use the PB built-in File methods ...  ie: FileDelete ( ) ?
  •   Also, the PFC has a File Service NVUO that has more Windows API file functions (ie: RemoveDirectory , MoveFile, etc ) that you could also use.

HTH

Regards ... Chris

Comment
Chris,



We are using this method because it supports multiple file deletion using wildcards.



Thanks,



Don

  1. Don Olliver
  2. Monday, 7 May 2018
Hi 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



 

  1. Chris Pollach
  2. Monday, 7 May 2018
There are no comments made yet.
  1. Friday, 4 May 2018
  2. PowerBuilder
  3. # 2
  • Page :
  • 1


There are no replies made for this question yet.
However, you are not allowed to reply to this question.