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
Chris Pollach @Appeon Accepted Answer Pending Moderation
  1. Friday, 4 May 2018 19:16 PM UTC
  2. PowerBuilder
  3. # 1

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

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.
  • Page :
  • 1


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