Preview of a file

AntoninoP
Posts: 347
Joined: Tue Feb 10, 2015 9:48 am
Location: Albenga, Italy
Contact:

Re: Preview of a file

Post by AntoninoP »

mastintin wrote:txt, bat file not work properly yet :-( ( I've looked )
The preview is for a service that some installed program provides, Images and text files are easily preview-able so there is no service.
User avatar
nageswaragunupudi
Posts: 8017
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Contact:

Re: Preview of a file

Post by nageswaragunupudi »

I am able to preview docx,xlsx,pptx but not doc, xls, ppt.
Any hint?

I am more interested in pdf, but it did not work for me. I get to see the navigation screen with controls except matter. I need to try again when I find some time again.
Regards

G. N. Rao.
Hyderabad, India
AntoninoP
Posts: 347
Joined: Tue Feb 10, 2015 9:48 am
Location: Albenga, Italy
Contact:

Re: Preview of a file

Post by AntoninoP »

on my pc, doc preview is provided by OpenIOffice, and docx preview by MSOffice
The preview is a service, it depends on installed application :(
User avatar
mastintin
Posts: 1502
Joined: Thu May 27, 2010 2:06 pm

Re: Preview of a file

Post by mastintin »

Nages. You ar this key in regedit ?
HKEY_CLASSES_ROOT\.xls\ShellEx\{8895b1c6-b41f-4c1c-a562-0d564250836f}"\Default :=" {00020827-0000-0000-C000-000000000046}"

if it does not create it , restart your pc and and try again.
tell us if it works.

one more thing ...
hb_parptr and hb_retptr is compatible with xHarbour ?

you can place a code c ++ in #pragma BEGINDUMP ? some modifier?
AntoninoP
Posts: 347
Joined: Tue Feb 10, 2015 9:48 am
Location: Albenga, Italy
Contact:

Re: Preview of a file

Post by AntoninoP »

Hello,
I am starting with apologies for the long post. Here a little experiment I am doing at home.
It is an harbour/com interface, an I am starting with IPreviewHadler. For now the file are created by hand, but i am writing an harbour program that create them from idl.

let start with IUnknown, the COM base class:

Code: Select all

#include <hbclass.ch>

FUNCTION  ExaVal( cString )
   LOCAL nX, nVal
   LOCAL cNewString := upper(AllTrim( cString ))
   LOCAL nLen := Len( cNewString )
   LOCAL nNumber := 0
   FOR nX := 1 TO nLen
      nVal := At( SubStr( cNewString, nX, 1 ), "0123456789ABCDEF" ) - 1
      if nVal<0
         return 0
      endif
      nNumber += ( nVal * ( 16 ** ( nLen - nX ) ) )
   NEXT
RETURN nNumber


FUNC iidFromString(str)
   LOCAL r
   //example: {00000000-0000-0000-0000-000000000000}
   //         12345678901234567890123456789012345678
   //                  1         2         3
   if len(str)<>38 .or. ;
      substr(str,1,1) <> "{" .or. substr(str,38,1) <> "}" .or. ;
      substr(str,10,1) <> "-" .or. substr(str,15,1) <> "-" .or. ;
      substr(str,20,1) <> "-" .or. substr(str,25,1) <> "-"
         return {}
   endif
   r := Array(11)
   r[1] := ExaVal(substr(str,2,8))
   r[2] := ExaVal(substr(str,11,4))
   r[3] := ExaVal(substr(str,16,4))
   r[4] := ExaVal(substr(str,21,2))
   r[5] := ExaVal(substr(str,23,2))
   r[6] := ExaVal(substr(str,26,2))
   r[7] := ExaVal(substr(str,28,2))
   r[8] := ExaVal(substr(str,30,2))
   r[9] := ExaVal(substr(str,32,2))
   r[10] := ExaVal(substr(str,34,2))
   r[11] := ExaVal(substr(str,36,2))
return r   

CLASS IUnknown
   DATA iPtr

   METHOD New(iptr) CONSTRUCTOR
   
   METHOD AddRef()
   Destructor Release()
   
   METHOD QueryInterface(riid, dest)
   
   METHOD SetPtr(ptr)
endclass

METHOD New(iptr) CLASS IUnknown
   ::iPtr := iptr
return Self

METHOD SetPtr(ptr) CLASS IUnknown
   if Valtype(::iPtr) == "P"
      ::Release()
   endif
   ::iPtr := ptr
   if Valtype(::iPtr) == "P"
      ::AddRef()
   endif
return nil

#pragma BEGINDUMP
#include <windows.h>
#include <hbapi.h>
#include <hbstack.h>
#include <hbapiitm.h>

#include <stdio.h>

/* 0*/ typedef HRESULT (__stdcall *IUnknown_QueryInterface )(void* This,REFIID riid,void **ppvObject);
/* 1*/ typedef ULONG (__stdcall *IUnknown_AddRef )(void* This);
/* 2*/ typedef ULONG (__stdcall *IUnknown_Release )(void* This);

void* GetFunctionPtr(void* ptrInt,int id) 
{
   void** _i = (void**)(*(void**)ptrInt);
   return _i+id;
}

GUID GUIDFromArray(PHB_ITEM pArr)
{
   GUID ret;
    ret.Data1 = (unsigned long)(hb_itemGetND(hb_itemArrayGet(pArr,1)));
    ret.Data2 = (unsigned short)hb_itemGetNL(hb_itemArrayGet(pArr,2));
    ret.Data3 = (unsigned short)hb_itemGetNL(hb_itemArrayGet(pArr,3));
    ret.Data4[0] = (unsigned char)hb_itemGetNL(hb_itemArrayGet(pArr,4));
    ret.Data4[1] = (unsigned char)hb_itemGetNL(hb_itemArrayGet(pArr,5));
    ret.Data4[2] = (unsigned char)hb_itemGetNL(hb_itemArrayGet(pArr,6));
    ret.Data4[3] = (unsigned char)hb_itemGetNL(hb_itemArrayGet(pArr,7));
    ret.Data4[4] = (unsigned char)hb_itemGetNL(hb_itemArrayGet(pArr,8));
    ret.Data4[5] = (unsigned char)hb_itemGetNL(hb_itemArrayGet(pArr,9));
    ret.Data4[6] = (unsigned char)hb_itemGetNL(hb_itemArrayGet(pArr,10));
    ret.Data4[7] = (unsigned char)hb_itemGetNL(hb_itemArrayGet(pArr,11));
   return ret;
}


HB_FUNC( COCREATEINSTANCE ) //clsid, ctx, riid, dest
{
   GUID clsid = GUIDFromArray(hb_param(1, HB_IT_ARRAY ));
   DWORD ctx = hb_parnl( 2 );
   GUID riiid = GUIDFromArray(hb_param(3, HB_IT_ARRAY ));
   void* ptr;
   //wchar_t test[50];
   //StringFromGUID2(&clsid,test,50);
   //MessageBoxW(0,test,L"CLSID",MB_OK);
   //StringFromGUID2(&riiid,test,50);
   //MessageBoxW(0,test,L"RIIID",MB_OK);
   
   HRESULT hr;
#if defined(__cplusplus)
   hr = CoCreateInstance( clsid, 0, ctx, riiid, ( void ** ) &ptr );
#else
   hr = CoCreateInstance( &clsid, 0, ctx, &riiid, ( void ** ) &ptr );
#endif
   if(ptr)
      hb_storptr(ptr, 4); 
   else
      hb_stor(4); 
   hb_retnl(hr);
}

HB_FUNC( IUNKNOWN_QUERYINTERFACE )
{
   PHB_ITEM pSelf = hb_stackSelfItem();
   void* ptr = hb_itemGetPtr(hb_itemArrayGet(pSelf,1)); 
   if(ptr)
   {
      IUnknown_QueryInterface* fn = (IUnknown_QueryInterface*)GetFunctionPtr(ptr,0);
      GUID riiid = GUIDFromArray(hb_param(1, HB_IT_ARRAY ));
      void* pvObject;
      
      HRESULT ret = (*fn)(ptr,&riiid,&pvObject);
      
      if( pvObject != 0 )
         hb_storptr(pvObject,2);
      else
         hb_stor(2);
      
      hb_retnl(ret);
   } else
   {
      hb_stor(2); //nil
      hb_retnl(0x8032001C); //A required pointer is null.
   }
}

HB_FUNC( IUNKNOWN_ADDREF )
{
   PHB_ITEM pSelf = hb_stackSelfItem();
   void* ptr = hb_itemGetPtr(hb_itemArrayGet(pSelf,1)); 
   ULONG ret;
   if( ptr )
   {
      IUnknown_AddRef* fn = (IUnknown_AddRef*)GetFunctionPtr(ptr,1);
      ret = (*fn)(ptr);
   } else
   {
      ret = 0x8032001C; //A required pointer is null.
   }
   hb_retnl(ret);
}

HB_FUNC( IUNKNOWN_RELEASE )
{
   PHB_ITEM pSelf = hb_stackSelfItem();
   void* ptr = hb_itemGetPtr(hb_itemArrayGet(pSelf,1)); 
   ULONG ret;
   if( ptr )
   {
      IUnknown_Release* fn = (IUnknown_Release*)GetFunctionPtr(ptr,2);
      ret = (*fn)(ptr);
   } else
   {
      ret = 0x8032001C; //A required pointer is null.
   }
   
   hb_retnl(ret);
}


#pragma ENDDUMP
now the intefaces we needs for preview: IPreviewHandler

Code: Select all

#include <hbclass.ch>

/* From ShObjIdl.idl
[
    object,
    uuid(8895b1c6-b41f-4c1c-a562-0d564250836f),
]
interface IPreviewHandler : IUnknown
{
    HRESULT SetWindow(
        [in] HWND hwnd,
        [in] const RECT *prc);

    HRESULT SetRect([in] const RECT *prc);

    HRESULT DoPreview();

    HRESULT Unload();

    HRESULT SetFocus();

    HRESULT QueryFocus([out] HWND* phwnd);

    HRESULT TranslateAccelerator([in] MSG* pmsg);
}
*/

#define IID_IPreviewHandler {0x8895b1c6,0xb41f,0x4c1c,0xa5,0x62,0x0d,0x56,0x42,0x50,0x83,0x6f}

class IPreviewHandler FROM IUnknown
   METHOD SetWindow(hwnd,prc)
   METHOD SetRect(prc)
   METHOD DoPreview()
   METHOD Unload()
   METHOD SetFocus()
   METHOD QueryFocus(phwnd)
   //METHOD TranslateAccelerator(pmsg); msg strunct non handled
endclass

#pragma BEGINDUMP
#include <windows.h>
#include <hbapi.h>
#include <hbstack.h>
#include <hbapiitm.h>

/* 3*/typedef HRESULT (__stdcall *IPreviewHandler_SetWindow)(void* This,HWND hwnd,const RECT *prc);
/* 4*/typedef HRESULT (__stdcall *IPreviewHandler_SetRect)(void* This,const RECT *prc);
/* 5*/typedef HRESULT (__stdcall *IPreviewHandler_DoPreview)(void* This);
/* 6*/typedef HRESULT (__stdcall *IPreviewHandler_Unload)(void* This);
/* 7*/typedef HRESULT (__stdcall *IPreviewHandler_SetFocus)(void* This);
/* 8*/typedef HRESULT (__stdcall *IPreviewHandler_QueryFocus)(void* This,HWND* phwnd);
/* 9*/typedef HRESULT (__stdcall *IPreviewHandler_TranslateAccelerator)(void* This,MSG* pmsg);

void* GetFunctionPtr(void* ptrInt,int id);

HB_FUNC( IPREVIEWHANDLER_SETWINDOW )
{
   PHB_ITEM pSelf = hb_stackSelfItem();
   void* ptr = hb_itemGetPtr(hb_itemArrayGet(pSelf,1)); 
   IPreviewHandler_SetWindow* fn = (IPreviewHandler_SetWindow*)GetFunctionPtr(ptr,3);
#ifndef _WIN64
   HWND hWnd = ( HWND ) hb_parnl( 1 );
#else
   HWND hWnd = ( HWND ) hb_parnll( 1 );
#endif
   RECT rc,*prc = NULL;
   HRESULT retVal;
   if( hb_param(2, HB_IT_ARRAY) != 0 )
   {
      rc.top    = hb_parvni( 2, 1);
      rc.left   = hb_parvni( 2, 2);
      rc.bottom = hb_parvni( 2, 3);
      rc.right  = hb_parvni( 2, 4);
      prc = &rc;
   } else prc = 0;

   retVal = (*fn)(ptr,hWnd,prc);
   hb_retnl(retVal);
}

HB_FUNC( IPREVIEWHANDLER_SETRECT )
{
   PHB_ITEM pSelf = hb_stackSelfItem();
   void* ptr = hb_itemGetPtr(hb_itemArrayGet(pSelf,1)); 
   IPreviewHandler_SetRect* fn = (IPreviewHandler_SetRect*)GetFunctionPtr(ptr,4);
   RECT rc,*prc = NULL;
   HRESULT retVal;
   if( hb_param(1, HB_IT_ARRAY) != 0 )
   {
      rc.top    = hb_parvni( 1, 1);
      rc.left   = hb_parvni( 1, 2);
      rc.bottom = hb_parvni( 1, 3);
      rc.right  = hb_parvni( 1, 4);
      prc = &rc;
   } else prc = 0;

   retVal = (*fn)(ptr,prc);
   hb_retnl(retVal);
}

HB_FUNC( IPREVIEWHANDLER_DOPREVIEW )
{
   PHB_ITEM pSelf = hb_stackSelfItem();
   void* ptr = hb_itemGetPtr(hb_itemArrayGet(pSelf,1)); 
   IPreviewHandler_DoPreview* fn = (IPreviewHandler_DoPreview*)GetFunctionPtr(ptr,5);
   HRESULT retVal;
   retVal = (*fn)(ptr);
   hb_retnl(retVal);
}

HB_FUNC( IPREVIEWHANDLER_UNLOAD )
{
   PHB_ITEM pSelf = hb_stackSelfItem();
   void* ptr = hb_itemGetPtr(hb_itemArrayGet(pSelf,1)); 
   IPreviewHandler_Unload* fn = (IPreviewHandler_Unload*)GetFunctionPtr(ptr,6);
   HRESULT retVal;
   retVal = (*fn)(ptr);
   hb_retnl(retVal);
}

HB_FUNC( IPREVIEWHANDLER_SETFOCUS )
{
   PHB_ITEM pSelf = hb_stackSelfItem();
   void* ptr = hb_itemGetPtr(hb_itemArrayGet(pSelf,1)); 
   IPreviewHandler_SetFocus* fn = (IPreviewHandler_SetFocus*)GetFunctionPtr(ptr,7);
   HRESULT retVal;
   retVal = (*fn)(ptr);
   hb_retnl(retVal);
}

HB_FUNC( IPREVIEWHANDLER_QUERYFOCUS )
{
   PHB_ITEM pSelf = hb_stackSelfItem();
   void* ptr = hb_itemGetPtr(hb_itemArrayGet(pSelf,1)); 
   IPreviewHandler_QueryFocus* fn = (IPreviewHandler_QueryFocus*)GetFunctionPtr(ptr,7);
   HWND hWnd;
   HRESULT retVal;

   retVal = (*fn)(ptr,&hWnd);

#ifndef _WIN64
   hb_stornl((long)hWnd,1);
#else
   hb_stornll((HB_LONGLONG)hWnd,1);
#endif
   hb_retnl(retVal);
}

#pragma ENDDUMP
IInitializeWithFile

Code: Select all

#include <hbclass.ch>

/* From propsys.idl
[
    uuid(b7d14566-0509-4cce-a71f-0a554233bd9b),
    object,
    pointer_default(unique)
]
interface IInitializeWithFile : IUnknown
{
    HRESULT Initialize([in, string] LPCWSTR pszFilePath, [in] DWORD grfMode);
}
*/

#define IID_IInitializeWithFile {0xb7d14566,0x0509,0x4cce,0xa7,0x1f,0x0a,0x55,0x42,0x33,0xbd,0x9b}

class IInitializeWithFile FROM IUnknown
   METHOD Initialize(pszFilePath,grfMode)
endclass

#pragma BEGINDUMP
#include <windows.h>
#include <hbapi.h>
#include <hbstack.h>
#include <hbapiitm.h>

/* 3*/typedef HRESULT (__stdcall *IInitializeWithFile_Initialize)(void* This,LPCWSTR pszFilePath, DWORD grfMode);

void* GetFunctionPtr(void* ptrInt,int id);
LPWSTR UTF8toUTF16( LPCSTR utf8 );

HB_FUNC( IINITIALIZEWITHFILE_INITIALIZE )
{
   PHB_ITEM pSelf = hb_stackSelfItem();
   void* ptr = hb_itemGetPtr(hb_itemArrayGet(pSelf,1)); 
   IInitializeWithFile_Initialize* fn = (IInitializeWithFile_Initialize*)GetFunctionPtr(ptr,3);
   LPCWSTR pszFilePath = UTF8toUTF16(hb_parc(1));
   DWORD grfMode = hb_parnl(2);
   HRESULT retVal;

   retVal = (*fn)(ptr,pszFilePath,grfMode);
   hb_xfree( (void*) pszFilePath);
   hb_retnl(retVal);
}

#pragma ENDDUMP
and IInitializeWithStream

Code: Select all

#include <hbclass.ch>

/* From propsys.idl
[
    uuid(b824b49d-22ac-4161-ac8a-9916e8fa3f7f),
    object,
    pointer_default(unique)
]
interface IInitializeWithStream : IUnknown
{
    [local] HRESULT Initialize([in, annotation("_In_")] IStream *pstream, [in, annotation("_In_")] DWORD grfMode);
    [call_as(Initialize)] HRESULT RemoteInitialize([in] IStream *pstream, [in] DWORD grfMode);
}*/

#define IID_IInitializeWithStream {0xb824b49d,0x22ac,0x4161,0xac,0x8a,0x99,0x16,0xe8,0xfa,0x3f,0x7f}

class IInitializeWithStream FROM IUnknown
    METHOD Initialize(pstream, grfMode)
endclass

#pragma BEGINDUMP
#include <windows.h>
#include <hbapi.h>
#include <hbstack.h>
#include <hbapiitm.h>

/* 3*/typedef HRESULT (__stdcall *IInitializeWithStream_Initialize)(void* This,IStream *pstream, DWORD grfMode);

void* GetFunctionPtr(void* ptrInt,int id);

HB_FUNC( IINITIALIZEWITHSTREAM_INITIALIZE )
{
   PHB_ITEM pSelf = hb_stackSelfItem();
   void* ptr = hb_itemGetPtr(hb_itemArrayGet(pSelf,1)); 
   IInitializeWithStream_Initialize* fn = (IInitializeWithStream_Initialize*)GetFunctionPtr(ptr,3);
   IStream* pstream = (IStream*) hb_parptr(1);
   DWORD grfMode = hb_parnl(2);
   HRESULT retVal;

   retVal = (*fn)(ptr,pstream,grfMode);
   hb_retnl(retVal);
}

#pragma ENDDUMP
here the class that use all:

Code: Select all

#include <fivewin.ch>
#include <winapi.ch>

function main()

   local oDlg
   local oPreview
   // IMPORTANT!!
   CoInitialize()
   
   DEFINE WINDOW oDlg FROM  0,0 TO 650,650 PIXEL TITLE "Test"
   oPreview := TPreviewControl():New(30,10,oDlg, 600,600)
   oPreview:AcceptDropFile()
   
   @ 8,8 BUTTON "Clear" ACTION oPreview:Clear() PIXEL SIZE 32,16 OF oDlg
   
   ACTIVATE WINDOW oDlg CENTERED

return nil

CLASS TPreviewControl FROM TControl
   CLASSDATA lRegistered AS LOGICAL
   DATA pPreview INIT 0
   DATA pStream INIT 0

   METHOD New( nRow, nCol, oWnd, nWidth, nHeight ) CONSTRUCTOR
   METHOD Destroy()
   METHOD SetFile(cFile)
   METHOD AcceptDropFile()
   METHOD Clear()
   
   METHOD DropFiles( hDrop )
   METHOD Resize()

   METHOD Display() INLINE ::BeginPaint(), ::Paint(), ::EndPaint(), 0
ENDCLASS

METHOD New( nRow, nCol, oWnd, nWidth, nHeight ) CLASS TPreviewControl
   DEFAULT nRow := 10, nCol := 10, oWnd := GetWndDefault(), nWidth := 64, nHeight := 64
   ::oWnd     := oWnd
   ::nId      := ::GetNewId()
   ::nStyle   := nOR( WS_CHILD, WS_VISIBLE, WS_TABSTOP, WS_CLIPCHILDREN )
   ::nTop     := nRow
   ::nLeft    := nCol
   ::nBottom  := ::nTop + nHeight - 1
   ::nRight   := ::nLeft + nWidth   
   
   ::Register( nOR( CS_VREDRAW, CS_HREDRAW ) )
   ::Create()
   oWnd:AddControl( Self )
return Self

METHOD Destroy()
   ::Clear()
return ::Super:Destroy()   
  
METHOD Clear() CLASS TPreviewControl
   if valtype(::pPreview) == "O"
      ::pPreview:Unload()
   endif
   if Valtype(::pStream) == "P" 
      DestroyStream(::pStream)
   endif
   ::pPreview := 0
   ::pStream := 0
return nil

#define HKEY_CLASSES_ROOT       2147483648        // 0x80000000
#define IID_IPreviewHandler {0x8895b1c6,0xb41f,0x4c1c,0xa5,0x62,0x0d,0x56,0x42,0x50,0x83,0x6f}
#define IID_IInitializeWithFile {0xb7d14566,0x0509,0x4cce,0xa7,0x1f,0x0a,0x55,0x42,0x33,0xbd,0x9b}
#define IID_IInitializeWithStream {0xb824b49d,0x22ac,0x4161,0xac,0x8a,0x99,0x16,0xe8,0xfa,0x3f,0x7f}
#define CLSCTX_INPROC_SERVER 0x1
#define CLSCTX_LOCAL_SERVER 0x4

METHOD SetFile(cFile) CLASS TPreviewControl
   LOCAL cExtension, cKey, cid, nError, cls
   LOCAL pInit
   ::Clear()
   
   cExtension := substr(cFile,rat(".",cFile))
   cKey = cExtension + "\ShellEx\{8895b1c6-b41f-4c1c-a562-0d564250836f}"
   cid := ""
   //get preview guid
   nError = RegQueryValue( HKEY_CLASSES_ROOT, cKey, @cid )
   if nError <> 0
      cKey := Space(100)
      RegQueryValue( HKEY_CLASSES_ROOT, cExtension, @cKey )
      cKey := StrTran( cKey, Chr(0), "" )
      cKey := Alltrim(cKey) + "\ShellEx\{8895b1c6-b41f-4c1c-a562-0d564250836f}"
      nError = RegQueryValue( HKEY_CLASSES_ROOT, cKey, @cid )
   endif
   // crete the preview object
   if nError = 0
      cid := StrTran( cid, Chr(0), "" )
      cls := iidFromString(cid)
      nError := CoCreateInstance( cls, nOr( CLSCTX_INPROC_SERVER, CLSCTX_LOCAL_SERVER), IID_IPreviewHandler, @::pPreview )
   endif
      
   if Valtype(::pPreview) == "P" 
      ::pPreview := IPreviewHandler():New(::pPreview)
      //init the preview
      ::pPreview:QueryInterface(IID_IInitializeWithFile, @pInit)
      if Valtype(pInit) == "P" 
         pInit := IInitializeWithFile():New(pInit)
         pInit:Initialize(cFile, /*STGM_READ*/0)
      else
         ::pPreview:QueryInterface(IID_IInitializeWithStream, @pInit)
         if Valtype(pInit) == "P" 
            pInit := IInitializeWithStream():New(pInit)
            ::pStream := GetStream(cFile)
            pInit:Initialize(::pStream, /*STGM_READ*/0)
         else
            ::pPreview := 0
         endif
      endif
   endif

   if valtype(::pPreview) == "O"
      ::pPreview:SetWindow(::hWnd, GetClientRect( ::hWnd ))
      ::pPreview:DoPreview()
   endif
   
return self

METHOD Resize()
   ::pPreview:SetRect( GetClientRect( ::hWnd ))
return self

METHOD AcceptDropFile() CLASS TPreviewControl
   DragAcceptFiles( ::hWnd, .T. )
return Self

METHOD DropFiles( hDrop ) CLASS TPreviewControl
   LOCAL files
   files = DragQueryFiles( hDrop )
   ::SetFile( files[1])
return Self

#pragma BEGINDUMP
#define CINTERFACE
#define COBJMACROS
#include <Ole2.h>
#include <hbapi.h>
#include <unknwn.h>

LPWSTR UTF8toUTF16( LPCSTR utf8 );
HB_FUNC( GETSTREAM ) // cFileName
{
   wchar_t* cFileName = UTF8toUTF16(hb_parc(1));
   HANDLE hFile = CreateFileW(cFileName,FILE_READ_DATA,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL );
   DWORD dwSize = GetFileSize( hFile, NULL );
   HGLOBAL hGlobal= GlobalAlloc(GPTR, dwSize );
   BYTE * pByte = (BYTE *)GlobalLock(hGlobal);
   LPSTREAM pStream;
   ReadFile(hFile,pByte,dwSize,&dwSize,NULL);   
   GlobalUnlock(hGlobal);
   CloseHandle( hFile );

   CreateStreamOnHGlobal(hGlobal, TRUE, &pStream);  
   hb_xfree( (void*) cFileName);
   hb_retptr(pStream);
}

HB_FUNC( DESTROYSTREAM ) // stream
{
   LPSTREAM pStream = hb_parptr(1);
   HGLOBAL  hGlobal;
   if( pStream )
   {
      GetHGlobalFromStream(pStream,&hGlobal);
      if(hGlobal)
         GlobalFree(hGlobal);
      IUnknown_Release(pStream);
   }
   hb_ret();
}
#pragma ENDDUMP
the TPreviewControl is re-usable.

except for the stream part I think the last file is easily understand-able, and this code should compile with borland 5 also.
AntoninoP
Posts: 347
Joined: Tue Feb 10, 2015 9:48 am
Location: Albenga, Italy
Contact:

Re: Preview of a file

Post by AntoninoP »

mastintin wrote:Nages. You ar this key in regedit ?
HKEY_CLASSES_ROOT\.xls\ShellEx\{8895b1c6-b41f-4c1c-a562-0d564250836f}"\Default :=" {00020827-0000-0000-C000-000000000046}"
every com object must be registered, add the uuid from another pc is useless.
User avatar
mastintin
Posts: 1502
Joined: Thu May 27, 2010 2:06 pm

Re: Preview of a file

Post by mastintin »

AntoninoP wrote: every com object must be registered, add the uuid from another pc is useless.

It is correct but are com object registered by default in the installation of windows and preview for Excel is installed it can see xlsx.
On :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\PreviewHandlers
They are the previewers installed and its keys .They are the same Keys on all computers (except versions)
It's easy to add support for other file types ..
I not have viewer for txt or prg files. I added the keys :
HKEY_CLASSES_ROOT\.txt\ShellEx\{8895b1c6-b41f-4c1c-a562-0d564250836f}\default
and
HKEY_CLASSES_ROOT\.prg\ShellEx\{8895b1c6-b41f-4c1c-a562-0d564250836f}\default

and key for PreviewHadler for txt ( view : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\PreviewHandlers )
default := {1531d583-8375-4d3f-b5fb-d23bbd169f22}

\default:={1531d583-8375-4d3f-b5fb-d23bbd169f22}
Last edited by mastintin on Fri Jul 10, 2015 5:56 am, edited 6 times in total.
User avatar
mastintin
Posts: 1502
Joined: Thu May 27, 2010 2:06 pm

Re: Preview of a file

Post by mastintin »

AntoninoP wrote:Hello,
I am starting with apologies for the long post. Here a little experiment I am doing at home.
It is an harbour/com interface, an I am starting with IPreviewHadler. For now the file are created by hand, but i am writing an harbour program that create them from idl.
.....
UFF. all this leaves my code in a joke :-)

Anyway here I leave the code that I have in just a prg and extra file header for bcc582.
Me is running in pdf, excel, word, rtf, cmd,bat, txt files (Excel and Word does not release).
In :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\PreviewHandlers
They are the previewers installed and its keys .

The Shextra.h file :

Code: Select all

#pragma option push -b -a8 -pc -A- /*P_O_Push*/


/* this ALWAYS GENERATED file contains the definitions for the interfaces */


 /* File created by MIDL compiler version 6.00.0366 */
/* Compiler settings for shobjidl.idl:
    Oicf, W1, Zp8, env=Win32 (32b run)
    protocol : dce , ms_ext, c_ext, robust
    error checks: allocation ref bounds_check enum stub_data
    VC __declspec() decoration level:
         __declspec(uuid()), __declspec(selectany), __declspec(novtable)
         DECLSPEC_UUID(), MIDL_INTERFACE()
*/
//@@MIDL_FILE_HEADING(  )

#pragma warning( disable: 4049 )  /* more than 64k source lines */


/* verify that the <rpcndr.h> version is high enough to compile this file*/
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

#include "rpc.h"
#include "rpcndr.h"

#ifndef __RPCNDR_H_VERSION__
#error this stub requires an updated version of <rpcndr.h>
#endif // __RPCNDR_H_VERSION__

#ifndef COM_NO_WINDOWS_H
#include "windows.h"
#include "ole2.h"
#endif /*COM_NO_WINDOWS_H*/

#ifndef __shobjidl_h__
#define __shobjidl_h__

#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#pragma once
#endif

/* Forward Declarations */


#ifndef __IPreviewHandler_FWD_DEFINED__
#define __IPreviewHandler_FWD_DEFINED__
typedef interface IPreviewHandler IPreviewHandler;
#endif  /* __IPreviewHandler_FWD_DEFINED__ */


#ifndef __IInitializeWithFile_FWD_DEFINED__
#define __IInitializeWithFile_FWD_DEFINED__
typedef interface IInitializeWithFile IInitializeWithFile;
#endif  /* __IInitializeWithFile_FWD_DEFINED__ */


#ifndef __IInitializeWithStream_FWD_DEFINED__
#define __IInitializeWithStream_FWD_DEFINED__
typedef interface IInitializeWithStream IInitializeWithStream;
#endif  /* __IInitializeWithStream_FWD_DEFINED__ */


#ifdef __cplusplus
extern "C"{
#endif

void * __RPC_USER MIDL_user_allocate(size_t);
void __RPC_USER MIDL_user_free( void * );

/* interface __MIDL_itf_shobjidl_0000 */
/* [local] */

#ifndef _WINRESRC_
#ifndef _WIN32_IE
#define _WIN32_IE 0x0501
#else
#if (_WIN32_IE < 0x0400) && defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0500)
#error _WIN32_IE setting conflicts with _WIN32_WINNT setting
#endif
#endif
#endif


extern RPC_IF_HANDLE __MIDL_itf_shobjidl_0000_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_shobjidl_0000_v0_0_s_ifspec;

#ifndef __IPreviewHandler_INTERFACE_DEFINED__
#define __IPreviewHandler_INTERFACE_DEFINED__

/* interface IPreviewHandler */
/* [uuid][object] */ 

EXTERN_C const IID IID_IPreviewHandler;


 
#if defined(__cplusplus) && !defined(CINTERFACE)
    
    MIDL_INTERFACE("8895b1c6-b41f-4c1c-a562-0d564250836f")
    IPreviewHandler : public IUnknown
    {
    public:
        virtual HRESULT STDMETHODCALLTYPE SetWindow( 
            /* [in] */  HWND hwnd,
            /* [in] */ const RECT *prc) = 0;
        
        virtual HRESULT STDMETHODCALLTYPE SetRect( 
            /* [in] */  const RECT *prc) = 0;
        
        virtual HRESULT STDMETHODCALLTYPE DoPreview( void) = 0;
        
        virtual HRESULT STDMETHODCALLTYPE Unload( void) = 0;
        
        virtual HRESULT STDMETHODCALLTYPE SetFocus( void) = 0;
        
        virtual HRESULT STDMETHODCALLTYPE QueryFocus( 
            /* [out] */ HWND *phwnd) = 0;
        
        virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator( 
            /* [in] */  MSG *pmsg) = 0;
        
    };
    
#else   /* C style interface */

    typedef struct IPreviewHandlerVtbl
    {
        BEGIN_INTERFACE
        
        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
             IPreviewHandler * This,
            /* [in] */ REFIID riid,
            /* [annotation][iid_is][out] */ 
              void **ppvObject);
        
        ULONG ( STDMETHODCALLTYPE *AddRef )( 
            IPreviewHandler * This);
        
        ULONG ( STDMETHODCALLTYPE *Release )( 
             IPreviewHandler * This);
        
        HRESULT ( STDMETHODCALLTYPE *SetWindow )( 
             IPreviewHandler * This,
            /* [in] */  HWND hwnd,
            /* [in] */  const RECT *prc);
        
        HRESULT ( STDMETHODCALLTYPE *SetRect )( 
            IPreviewHandler * This,
            /* [in] */  const RECT *prc);
        
        HRESULT ( STDMETHODCALLTYPE *DoPreview )( 
             IPreviewHandler * This);
        
        HRESULT ( STDMETHODCALLTYPE *Unload )( 
             IPreviewHandler * This);
        
        HRESULT ( STDMETHODCALLTYPE *SetFocus )( 
             IPreviewHandler * This);
        
        HRESULT ( STDMETHODCALLTYPE *QueryFocus )( 
             IPreviewHandler * This,
            /* [out] */  HWND *phwnd);
        
        HRESULT ( STDMETHODCALLTYPE *TranslateAccelerator )( 
             IPreviewHandler * This,
            /* [in] */  MSG *pmsg);
        
        END_INTERFACE
    } IPreviewHandlerVtbl;

    interface IPreviewHandler
    {
        CONST_VTBL struct IPreviewHandlerVtbl *lpVtbl;
    };

    

#ifdef COBJMACROS


#define IPreviewHandler_QueryInterface(This,riid,ppvObject) \
    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) 

#define IPreviewHandler_AddRef(This)    \
    ( (This)->lpVtbl -> AddRef(This) ) 

#define IPreviewHandler_Release(This)   \
    ( (This)->lpVtbl -> Release(This) ) 


#define IPreviewHandler_SetWindow(This,hwnd,prc)    \
    ( (This)->lpVtbl -> SetWindow(This,hwnd,prc) ) 

#define IPreviewHandler_SetRect(This,prc)   \
    ( (This)->lpVtbl -> SetRect(This,prc) ) 

#define IPreviewHandler_DoPreview(This) \
    ( (This)->lpVtbl -> DoPreview(This) ) 

#define IPreviewHandler_Unload(This)    \
    ( (This)->lpVtbl -> Unload(This) ) 

#define IPreviewHandler_SetFocus(This)  \
    ( (This)->lpVtbl -> SetFocus(This) ) 

#define IPreviewHandler_QueryFocus(This,phwnd)  \
    ( (This)->lpVtbl -> QueryFocus(This,phwnd) ) 

#define IPreviewHandler_TranslateAccelerator(This,pmsg) \
    ( (This)->lpVtbl -> TranslateAccelerator(This,pmsg) ) 

#endif /* COBJMACROS */


#endif  /* C style interface */

#endif  /* __IPreviewHandler_INTERFACE_DEFINED__ */



#ifndef __IInitializeWithFile_INTERFACE_DEFINED__
#define __IInitializeWithFile_INTERFACE_DEFINED__

/* interface IInitializeWithFile */
/* [unique][object][uuid] */ 


EXTERN_C const IID IID_IInitializeWithFile;

#if defined(__cplusplus) && !defined(CINTERFACE)
    
    MIDL_INTERFACE("b7d14566-0509-4cce-a71f-0a554233bd9b")
    IInitializeWithFile : public IUnknown
    {
    public:
        virtual HRESULT STDMETHODCALLTYPE Initialize( 
            /* [string][in] */  LPCWSTR pszFilePath,
            /* [in] */ DWORD grfMode) = 0;
        
    };
    
#else   /* C style interface */

    typedef struct IInitializeWithFileVtbl
    {
        BEGIN_INTERFACE
        
        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
           IInitializeWithFile * This,
            /* [in] */  REFIID riid,
            /* [annotation][iid_is][out] */ 
              void **ppvObject);
        
        ULONG ( STDMETHODCALLTYPE *AddRef )( 
             IInitializeWithFile * This);
        
        ULONG ( STDMETHODCALLTYPE *Release )( 
            IInitializeWithFile * This);
        
        HRESULT ( STDMETHODCALLTYPE *Initialize )( 
             IInitializeWithFile * This,
            /* [string][in] */  LPCWSTR pszFilePath,
            /* [in] */ DWORD grfMode);
        
        END_INTERFACE
    } IInitializeWithFileVtbl;

    interface IInitializeWithFile
    {
        CONST_VTBL struct IInitializeWithFileVtbl *lpVtbl;
    };

    

#ifdef COBJMACROS


#define IInitializeWithFile_QueryInterface(This,riid,ppvObject) \
    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) 

#define IInitializeWithFile_AddRef(This)    \
    ( (This)->lpVtbl -> AddRef(This) ) 

#define IInitializeWithFile_Release(This)   \
    ( (This)->lpVtbl -> Release(This) ) 


#define IInitializeWithFile_Initialize(This,pszFilePath,grfMode)    \
    ( (This)->lpVtbl -> Initialize(This,pszFilePath,grfMode) ) 

#endif /* COBJMACROS */


#endif  /* C style interface */

#endif  /* __IInitializeWithFile_INTERFACE_DEFINED__ */



#ifndef __IInitializeWithStream_INTERFACE_DEFINED__
#define __IInitializeWithStream_INTERFACE_DEFINED__

/* interface IInitializeWithStream */
/* [unique][object][uuid] */ 


EXTERN_C const IID IID_IInitializeWithStream;

#if defined(__cplusplus) && !defined(CINTERFACE)
    
    MIDL_INTERFACE("b824b49d-22ac-4161-ac8a-9916e8fa3f7f")
    IInitializeWithStream : public IUnknown
    {
    public:
        virtual /* [local] */ HRESULT STDMETHODCALLTYPE Initialize( 
            /* [annotation][in] */ 
              IStream *pstream,
            /* [annotation][in] */ 
              DWORD grfMode) = 0;
        
    };
    
#else   /* C style interface */

    typedef struct IInitializeWithStreamVtbl
    {
        BEGIN_INTERFACE
        
        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
             IInitializeWithStream * This,
            /* [in] */ REFIID riid,
            /* [annotation][iid_is][out] */ 
              void **ppvObject);
        
        ULONG ( STDMETHODCALLTYPE *AddRef )( 
             IInitializeWithStream * This);
        
        ULONG ( STDMETHODCALLTYPE *Release )( 
            IInitializeWithStream * This);
        
        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( 
            IInitializeWithStream * This,
            /* [annotation][in] */ 
             IStream *pstream,
            /* [annotation][in] */ 
             DWORD grfMode);
        
        END_INTERFACE
    } IInitializeWithStreamVtbl;

    interface IInitializeWithStream
    {
        CONST_VTBL struct IInitializeWithStreamVtbl *lpVtbl;
    };

    

#ifdef COBJMACROS


#define IInitializeWithStream_QueryInterface(This,riid,ppvObject)   \
    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) 

#define IInitializeWithStream_AddRef(This)  \
    ( (This)->lpVtbl -> AddRef(This) ) 

#define IInitializeWithStream_Release(This) \
    ( (This)->lpVtbl -> Release(This) ) 


#define IInitializeWithStream_Initialize(This,pstream,grfMode)  \
    ( (This)->lpVtbl -> Initialize(This,pstream,grfMode) ) 

#endif /* COBJMACROS */


#endif  /* C style interface */



/* [call_as] */ HRESULT STDMETHODCALLTYPE IInitializeWithStream_RemoteInitialize_Proxy( 
    IInitializeWithStream * This,
    /* [in] */  IStream *pstream,
    /* [in] */ DWORD grfMode);


void __RPC_STUB IInitializeWithStream_RemoteInitialize_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);



#endif  /* __IInitializeWithStream_INTERFACE_DEFINED__ */


#ifdef __cplusplus
}
#endif

#endif

#pragma option pop /*P_O_Pop*/

 
The program ....iprevH.prg

Code: Select all


// Our first DialogBox sample

#include "FiveWin.ch"

#include <fivewin.ch>
#define  HKEY_CLASSES_ROOT       2147483648        // 0x80000000

memvar oPreview

function main()

   local oDlg
   local hStream
   local cFile
   
   public oPreview
   // IMPORTANT!!
   cFile:= cGetfile("coge","*.*")
   if !empty( cfile )   
           
    DEFINE WINDOW oDlg FROM  0,0 TO 650,650 PIXEL TITLE "Test"
   
       GenHPreview( cFile, oDlg )
           
    ACTIVATE WINDOW oDlg CENTERED    
   
 endif     

return nil


Function GenHPreview( cFile, oDlg )

local cCLSString

 CoInitialize()
 cCLSString := SeekCLSString( cFile )
 oPreview := CreateHPreviewC( cCLSString )
 
 ADDPREVIEWC(oDlg:hWnd, {10,10,610,610}, cFile,oPreview )
 
Return nil


Function SeekCLSString( cFile )
local cExtension
local cKey := ""
local oReg
local cShellExe := "\ShellEx\{8895b1c6-b41f-4c1c-a562-0d564250836f}"
local cValue

if !Empty( cFile )
    cExtension := cFileExt( cFile )   
    if Empty( cExtension )
       MsgInfo( "not Extension File" )
       Return nil
    endif
    cExtension := "."+ cExtension 
    cKey := cExtension + cShellExe
   //  msginfo(cKey)
    oReg := TReg32():New( HKEY_CLASSES_ROOT, ckey )
    cValue := oReg:Get()
       
    if Empty( cValue ) 
       oreg:Close()
      //  msginfo(cKey)
       oReg := TReg32():New( HKEY_CLASSES_ROOT, cExtension )
       cValue := oReg:Get()
       if Empty( cValue )
          oReg:Close()
          MsgInfo( "Clave no encontrada" )
          Return nil
       endif
       cKey := cValue + cShellExe
      // msginfo(cKey)
       oReg := TReg32():New( HKEY_CLASSES_ROOT, cKey )
       cValue := oReg:Get()   
       if Empty( cValue )
          MsgInfo( "Clave no encontrada" )
          Return nil
       endIf       
    endif 
endif 
 
Return cValue




#pragma BEGINDUMP
#define CINTERFACE
#define COBJMACROS

#if ( __BORLANDC__ <= 0x582 )
    #include <Shextra.h>
#endif
    
#include <windows.h>
#include <hbapi.h>
#include <CommCtrl.h>
#include <ShObjIdl.h>
#include <Shlwapi.h>
#include <ShlGuid.h>



LPWSTR     AnsiToWide( LPSTR cAnsi );

  const IID IID_IPreviewHandler = {0x8895b1c6, 0xb41f, 0x4c1c, {0xa5, 0x62, 
0x0d, 0x56, 0x42, 0x50, 0x83, 0x6f}};

HB_FUNC( CREATEHPREVIEWC )  // clsStr 
{
   CLSID cls;
  IPreviewHandler* pRet=0;
  
   CLSIDFromString( AnsiToWide(( char * ) hb_parc( 1 )),&cls);
 
 if( CoCreateInstance( &cls, 0,  CLSCTX_INPROC_SERVER |CLSCTX_LOCAL_SERVER, &IID_IPreviewHandler, ( void ** ) &pRet ) ==S_OK )
   {

   #ifndef _WIN64
     hb_retnl( (long) pRet ) ;
   #else
       hb_retnll( (long long) pRet );
   #endif   
   return ;
   }
   
 //  MessageBoxW(0,cKey,cExtension,MB_OK);
   
  #ifndef _WIN64
     hb_retnl( (long) 0 );
   #else
       hb_retnll( (long long) 0 );
   #endif  
   return ;
  }


EXTERN_C const IID IID_IInitializeWithFile = {0xb7d14566, 0x0509, 0x4cce, {0xa7, 
0x1f, 0x0a, 0x55, 0x42, 0x33, 0xbd, 0x9b}};
  
EXTERN_C const IID  IID_IInitializeWithStream =
    { 0xB824B49D, 0x22AC, 0x4161, { 0xAC, 0x8A, 0x99, 0x16, 0xE8, 0xFA, 0x3F, 0x7F } };  

HB_FUNC( ADDPREVIEWC ) // hWnd, {nTop, nLeft, nBottom, nRight}, cFileName,pPreview
{
#ifndef _WIN64
   HWND hWnd = ( HWND ) hb_parnl( 1 );
    IPreviewHandler* pPreview = ( IPreviewHandler* ) hb_parnl( 4 );  
   #define RET hb_retnl( (long) pPreview );
#else   
   HWND hWnd = ( HWND ) hb_parnll( 1 );
   IPreviewHandler* pPreview = ( IPreviewHandler* ) hb_parnll( 4 );  
   #define RET hb_retnll( (long long) pPreview );
#endif   
   RECT rectPreview;
   LPWSTR cFileName = AnsiToWide(( char * ) hb_parc( 3 ));
   LPCWSTR cExtension = wcsrchr(cFileName,L'.');
   IInitializeWithFile* pFile;
   IInitializeWithStream* pIStream;
   
   if(pPreview==0)
   {
      MessageBoxW(0,L"no pPreview",cExtension,MB_OK);
      RET
      return;
   }

   IPreviewHandler_QueryInterface(pPreview, &IID_IInitializeWithFile,(void**)&pFile );
   IPreviewHandler_QueryInterface(pPreview, &IID_IInitializeWithStream,(void**)&pIStream );
   
   if(pFile==0 && pIStream==0)
   {
      MessageBoxW(0,L"no pfile no pStream",cExtension,MB_OK);
      IPreviewHandler_Unload(pPreview);
      pPreview = 0;
      RET
      return;
   }
   if(pFile!=0)
   {
      IInitializeWithFile_Initialize(pFile, cFileName, STGM_READ);
   } else
   { //pIStream!=0
      HANDLE hFile = CreateFileW(cFileName,FILE_READ_DATA,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL );
     if( INVALID_HANDLE_VALUE != hFile )
     {
         DWORD dwSize = GetFileSize( hFile, NULL );
         HGLOBAL hGlobal= GlobalAlloc(GPTR, dwSize );
         BYTE * pByte = (BYTE *)GlobalLock(hGlobal);

         if( pByte )
         {
            LPSTREAM pStream;
            ReadFile(hFile,pByte,dwSize,&dwSize,NULL);  
            GlobalUnlock(hGlobal);

             CreateStreamOnHGlobal(hGlobal, TRUE, &pStream);    
             IInitializeWithStream_Initialize(pIStream, pStream, STGM_READ);
         }

         CloseHandle( hFile );
     }
   }
   hb_xfree( cFileName );
   
   rectPreview.top    = hb_parvni(2,1);
   rectPreview.left   = hb_parvni(2,2);
   rectPreview.bottom = hb_parvni(2,3);
   rectPreview.right  = hb_parvni(2,4);
     
   IPreviewHandler_SetWindow( pPreview, hWnd, &rectPreview );
   IPreviewHandler_DoPreview( pPreview );

   RET
}

HB_FUNC( UnloadPreviewC ) //preview
{
#ifndef _WIN64
   IPreviewHandler* pPreview = ( IPreviewHandler* ) hb_parnl( 1 );
#else   
   IPreviewHandler* pPreview = ( IPreviewHandler* ) hb_parnll( 1 );
#endif
   if( pPreview )
   {
      IPreviewHandler_Unload(pPreview);
   }
}

#pragma ENDDUMP



 
Last edited by mastintin on Fri Jul 10, 2015 7:07 am, edited 1 time in total.
User avatar
nageswaragunupudi
Posts: 8017
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Contact:

Re: Preview of a file

Post by nageswaragunupudi »

Manuel and Antonio,

This is a great help from you.
Regards

G. N. Rao.
Hyderabad, India
User avatar
mastintin
Posts: 1502
Joined: Thu May 27, 2010 2:06 pm

Re: Preview of a file

Post by mastintin »

for view Previewhandlers instaled :

Code: Select all


#include "FiveWin.ch"

#include <fivewin.ch>
#define  HKEY_CLASSES_ROOT       2147483648        // 0x80000000
#define  HKEY_LOCAL_MACHINE      2147483650

function main()

 
local aPreviewHandler:= {}
local cKey := "SOFTWARE\Microsoft\Windows\CurrentVersion\PreviewHandlers"

local  oReg := TReg32():New( HKEY_LOCAL_MACHINE, ckey )
  
 
 local nHandle, cValue, n := 0   
       
       while REGENUMValue( oReg:nHandle, n++, @cValue )  == 0
            aadd( aPreviewHandler, { cValue, oreg:get(cValue)  } )  
       end 
       XBrowser aPreviewHandler
        
        oReg:close()
   
 return nil


//--------------------------------------------------------------------

 
User avatar
bpd2000
Posts: 153
Joined: Tue Aug 05, 2014 9:48 am
Location: India

Re: Preview of a file

Post by bpd2000 »

mastintin wrote:for view Previewhandlers instaled :
Excellent
Thank you for sharing
Regards, Greetings

Try FWH. You will enjoy it's simplicity and power.!
User avatar
Silvio.Falconi
Posts: 4956
Joined: Thu Oct 18, 2012 7:17 pm

Re: Preview of a file

Post by Silvio.Falconi »

Manuel I test your sample and here not run

Code: Select all

Progetto: test, Ambiente: xFive_Pelles:
[1]:Harbour.Exe test.prg  /m /n0 /gc1 /es2 /iC:\Work\fwh\include /ic:\work\xHarbour\Include /jC:\Work\Errori\PREVIE~2\I18n\Main.hil /iinclude;c:\work\fwh\include;c:\work\xHarbour\include /oObj\test.c
xHarbour 1.2.3 Intl. (SimpLex) (Build 20140725)
Copyright 1999-2014, http://www.xharbour.org http://www.harbour-project.org/
Compiling 'test.prg'...
Generating international list to 'C:\Work\Errori\PREVIE~2\I18n\Main.hil'...
Generating C source output to 'Obj\test.c'...
Done.
Lines 89, Functions/Procedures 3, pCodes 275
[1]:Bcc32.Exe -M -c -O2  -tW -v- -X -DHB_FM_STATISTICS_OFF -DHB_NO_DEFAULT_API_MACROS -DHB_NO_DEFAULT_STACK_MACROS -DHB_OS_WIN_32 -IC:\Work\fwh\include -IC:\Work\bcc582\Include;c:\work\xHarbour\Include  -nC:\Work\Errori\PREVIE~2\Obj test.c
Borland C++ 5.82 for Win32 Copyright (c) 1993, 2005 Borland
test.c:
Error E2209 test.prg 97: Unable to open include file 'Shextra.h'
Error E2451 test.prg 117: Undefined symbol 'IPreviewHandler' in function HB_FUN_CREATEHPREVIEWC
Error E2451 test.prg 153: Undefined symbol 'IPreviewHandler' in function HB_FUN_ADDPREVIEWC
Error E2188 test.prg 153: Expression syntax in function HB_FUN_ADDPREVIEWC
Error E2140 test.prg 160: Declaration is not allowed here in function HB_FUN_ADDPREVIEWC
Error E2140 test.prg 161: Declaration is not allowed here in function HB_FUN_ADDPREVIEWC
Error E2140 test.prg 162: Declaration is not allowed here in function HB_FUN_ADDPREVIEWC
Error E2451 test.prg 163: Undefined symbol 'IInitializeWithFile' in function HB_FUN_ADDPREVIEWC
Error E2451 test.prg 164: Undefined symbol 'IInitializeWithStream' in function HB_FUN_ADDPREVIEWC
Warning W8065 test.prg 173: Call to function 'IPreviewHandler_QueryInterface' with no prototype in function HB_FUN_ADDPREVIEWC
Warning W8065 test.prg 174: Call to function 'IPreviewHandler_QueryInterface' with no prototype in function HB_FUN_ADDPREVIEWC
Warning W8065 test.prg 179: Call to function 'IPreviewHandler_Unload' with no prototype in function HB_FUN_ADDPREVIEWC
Warning W8065 test.prg 186: Call to function 'IInitializeWithFile_Initialize' with no prototype in function HB_FUN_ADDPREVIEWC
Warning W8065 test.prg 203: Call to function 'IInitializeWithStream_Initialize' with no prototype in function HB_FUN_ADDPREVIEWC
Warning W8065 test.prg 211: Call to function 'hb_parvni' with no prototype in function HB_FUN_ADDPREVIEWC
Warning W8065 test.prg 212: Call to function 'hb_parvni' with no prototype in function HB_FUN_ADDPREVIEWC
Warning W8065 test.prg 213: Call to function 'hb_parvni' with no prototype in function HB_FUN_ADDPREVIEWC
Warning W8065 test.prg 214: Call to function 'hb_parvni' with no prototype in function HB_FUN_ADDPREVIEWC
Warning W8065 test.prg 216: Call to function 'IPreviewHandler_SetWindow' with no prototype in function HB_FUN_ADDPREVIEWC
Warning W8065 test.prg 217: Call to function 'IPreviewHandler_DoPreview' with no prototype in function HB_FUN_ADDPREVIEWC
Error E2451 test.prg 225: Undefined symbol 'IPreviewHandler' in function HB_FUN_UnloadPreviewC
Error E2188 test.prg 225: Expression syntax in function HB_FUN_UnloadPreviewC
Warning W8065 test.prg 231: Call to function 'IPreviewHandler_Unload' with no prototype in function HB_FUN_UnloadPreviewC
*** 11 errors in Compile ***
 
I use : FiveWin for Harbour August 2020 (Revision) - Harbour 3.2.0dev (r1712141320) - Bcc7.30 - xMate ver. 1.15.3 - PellesC
User avatar
mastintin
Posts: 1502
Joined: Thu May 27, 2010 2:06 pm

Re: Preview of a file

Post by mastintin »

Silvio ,are errors of a different kind.
1.- 'hb_parvni' with no prototype
Xharbour not prototipe hb_parvni I think its equivalent is hb_parni ( I'm not sure )

2.- Unable to open include file 'Shextra.h'
missing header file that I created to work in bcc582 ..
http://forums.fivetechsupport.com/viewt ... 15#p179276
Here's the file. Place it in your include dir in bcc582.
once you made these changes tell me if there are more errors.
User avatar
Silvio.Falconi
Posts: 4956
Joined: Thu Oct 18, 2012 7:17 pm

Re: Preview of a file

Post by Silvio.Falconi »

strange I link file.h into compilation
do you use harbour ?
I use : FiveWin for Harbour August 2020 (Revision) - Harbour 3.2.0dev (r1712141320) - Bcc7.30 - xMate ver. 1.15.3 - PellesC
User avatar
Silvio.Falconi
Posts: 4956
Joined: Thu Oct 18, 2012 7:17 pm

Re: Preview of a file

Post by Silvio.Falconi »

sorry Now run ok
I use : FiveWin for Harbour August 2020 (Revision) - Harbour 3.2.0dev (r1712141320) - Bcc7.30 - xMate ver. 1.15.3 - PellesC
Post Reply