1. Don Olliver
  2. PowerBuilder
  3. Friday, 4 May 2018 18:48 PM UTC

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
  1. Friday, 4 May 2018 22:00 PM UTC
  2. PowerBuilder
  3. # 1

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
  1. Don Olliver
  2. Monday, 7 May 2018 15:45 PM UTC
Roland,



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



Thanks,



Don

  1. Helpful
There are no comments made yet.
Chris Pollach @Appeon Accepted Answer Pending Moderation
  1. Friday, 4 May 2018 19:16 PM UTC
  2. PowerBuilder
  3. # 2

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
  1. Don Olliver
  2. Monday, 7 May 2018 15:45 PM UTC
Chris,



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



Thanks,



Don

  1. Helpful
  1. Chris Pollach @Appeon
  2. Monday, 7 May 2018 16:08 PM UTC
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. Helpful
There are no comments made yet.
  • Page :
  • 1


There are no replies made for this question yet.
However, you are not allowed to reply to this question.
We use cookies which are necessary for the proper functioning of our websites. We also use cookies to analyze our traffic, improve your experience and provide social media features. If you continue to use this site, you consent to our use of cookies.