What you need to do is to get a reference of the object in use without increasing the reference counter. You can do that if you have the address of the object, and use CopyMemory to copy this address into a new reference variable. However you must then remove this reference by making the reference variable point to NULL, you do that simply by copy 0, to the reference variable. So your callback procedure should look like this:
vb Code:
  1. Public Function CopyProgressRoutine(ByVal TotalFileSize As Currency, ByVal TotalBytesTransferred As Currency, ByVal StreamSize As Currency, ByVal StreamBytesTransferred As Currency, ByVal dwStreamNumber As Long, ByVal dwCallbackReason As Long, ByVal hSourceFile As Long, ByVal hDestinationFile As Long, ByVal lpData As Long) As Long
  2.     Dim Pr As Double
  3.     Dim DataPointer As Long
  4.     Dim CfilesCopyFrame As ClsFiles
  5.     Dim CfilesCopyContent As ClsFiles
  6.        
  7. '    Recieved = lpData
  8.     Pr = (TotalBytesTransferred * 10000) / (TotalFileSize * 10000) * 100
  9.    
  10.     CopyMemory FilesClass, lpData, 4
  11.     FilesClass.ShowProgress Pr, "Test"
  12.     CopyMemory FilesClass, 0, 4
  13.    
  14.     'continue filecopy
  15.     CopyProgressRoutine = PROGRESS_CONTINUE
  16. End Function
You have FilesClass already declared, however I personally would move that declaration into the function as a local variable. I haven't done that above since I didn't want to make to much of a change to your code.

You must also change the code in your class module where you call CopyFilesEx, you almost had the correct code in the line you had comment out. The only difference is that you must pass the ObjPtr byval otherwise you pass a pointer to that pointer....
vb Code:
  1. Ret = CopyFileEx(source, Target, AddressOf CopyProgressRoutine, ByVal ObjPtr(Me), bCancel, COPY_FILE_RESTARTABLE)
Good luck!