Windows Toast notifications - second try

Re: Windows Toast notifications - second try

Postby ukoenig » Sun Apr 17, 2016 6:41 pm

Silvio,

combase.dll. What is it?
The combase.dll is a Microsoft COM for Windows.
This file is part of Microsoft® Windows® Operating System.
Combase.dll is developed by Microsoft Corporation.
It’s a system and hidden file.
Combase.dll is usually located in the %SYSTEM% folder and its usual size is 1,219,072 bytes.

Recommendation
The combase.dll process is safe and disabling it can be dangerous,
because programs on your computer need it to work correctly.

regards
Uwe :D
Since 1995 ( the first release of FW 1.9 )
i work with FW.
If you have any questions about special functions, maybe i can help.
User avatar
ukoenig
 
Posts: 4043
Joined: Wed Dec 19, 2007 6:40 pm
Location: Germany

Re: Windows Toast notifications - second try

Postby Silvio.Falconi » Sun Apr 17, 2016 10:04 pm

here give me an error error loading combase.dll
Since from 1991/1992 ( fw for clipper Rel. 14.4 - Momos)
I use : FiveWin for Harbour November 2023 - January 2024 - Harbour 3.2.0dev (harbour_bcc770_32_20240309) - Bcc7.70 - xMate ver. 1.15.3 - PellesC - mail: silvio[dot]falconi[at]gmail[dot]com
User avatar
Silvio.Falconi
 
Posts: 7063
Joined: Thu Oct 18, 2012 7:17 pm

Re: Windows Toast notifications - second try

Postby Antonio Linares » Sun Apr 17, 2016 10:16 pm

Silvio,

What Windows version are you using ?

You have to use Windows 10
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42107
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Windows Toast notifications - second try

Postby Antonio Linares » Mon Apr 18, 2016 4:25 pm

Borland Windows 10 Toasts support is (slowly) moving forward...

Code: Select all  Expand view  RUN
#include "FiveWin.ch"

function Main()

   local pString, cIID, pFactory
   local pXml, pNodeList, pNode

   RoInitialize( 1 )

   pString = WinRTString( "Windows.UI.Notifications.ToastNotificationManager" )

   // "50AC103F-D235-4598-BBEF-98FE4D1A3AD4"

   cIID = Chr( 0x3F ) + Chr( 0x10 ) + Chr( 0xAC ) + Chr( 0x50 ) + ;
          Chr( 0x35 ) + Chr( 0xD2 ) + Chr( 0x98 ) + Chr( 0x45 ) + ;
          Chr( 0xBB ) + Chr( 0xEF ) + Chr( 0x98 ) + Chr( 0xFE ) + ;
          Chr( 0x4D ) + Chr( 0x1A ) + Chr( 0x3A ) + Chr( 0xD4 )

   RoGetActivationFactory( pString, cIID, @pFactory )
   WindowsDeleteString( pString );

   // pFactory->GetTemplateContent( ... )
   WinRTMethod( pFactory, 9, 3, @pXml ) // 9: Ninth method, 3: fourth template

   pString = WinRTString( "text" )
   // pXML->GetElementsByTagName( ... )
   WinRTMethod( pXml, 17, pString, @pNodeList )
   WindowsDeleteString( pString )

   // pNodeList->Item( ... )
   WinRTMethod( pNodeList, 8, 0, @pNode )

   MsgInfo( pNode )

   RoUninitialize()

return nil

function WinRTString( cText )

   local pString
   
   WindowsCreateString( AnsiToWide( cText ), Len( cText ), @pString )

return pString

DLL FUNCTION RoInitialize( nType AS LONG ) AS LONG PASCAL LIB "combase.dll"

DLL FUNCTION RoUninitialize() AS VOID PASCAL LIB "combase.dll"

DLL FUNCTION WindowsCreateString( cWideText AS LPSTR, nLength AS LONG, @pString AS PTR ) ;
   AS LONG PASCAL LIB "combase.dll"
   
DLL FUNCTION WindowsDeleteString( pString AS PTR ) AS LONG PASCAL LIB "combase.dll"

DLL FUNCTION RoGetActivationFactory( pString AS PTR, REFIID AS LPSTR, @pFactory AS PTR ) ;
   AS LONG PASCAL LIB "combase.dll"

#pragma BEGINDUMP

#include <Windows.h>
#include <hbapi.h>

typedef void * ( __stdcall * PMETHOD0 )( void * );
typedef void * ( __stdcall * PMETHOD1 )( void *, void * );
typedef void * ( __stdcall * PMETHOD2 )( void *, void *, void * );

HB_FUNC( WINRTMETHOD ) // pInspectable, nMethod, params...
{
   IUnknown * unknown = ( IUnknown * ) hb_parnll( 1 );
   void * pMethod = ( ( void ** ) unknown->lpVtbl )[ hb_parnl( 2 ) - 1 ];
   IUnknown * pReturn;

   switch( hb_pcount() )
   {
      case 3:
         hb_retnll( ( HB_LONGLONG ) ( ( PMETHOD1 ) pMethod )( unknown, &pReturn ) );
         break;

      case 4:
         hb_retnll( ( HB_LONGLONG ) ( ( PMETHOD2 ) pMethod )( unknown, ( void * ) hb_parnll( 3 ), &pReturn ) );
         break;
   }

   if( HB_ISBYREF( 3 ) )
      hb_storvnll( ( HB_LONGLONG ) pReturn, 3 );

   if( HB_ISBYREF( 4 ) )
      hb_storvnll( ( HB_LONGLONG ) pReturn, 4 );
}  

#pragma ENDDUMP
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42107
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Windows Toast notifications - second try

Postby Antonio Linares » Mon Apr 18, 2016 8:46 pm

Windows 10 Notifications working with Borland! :-)

Important: In order to test it, a shortcut to the EXE must be created in the start menu

toastb.prg
Code: Select all  Expand view  RUN
#include "FiveWin.ch"

function Main()

   local pString, cIID, pToastFactory
   local pXml, pNodeList, pNode
   local pNotification, pNotificationFactory, pNotifier

   RoInitialize( 1 )

   pString = WinRTString( "Windows.UI.Notifications.ToastNotificationManager" )

   // "50AC103F-D235-4598-BBEF-98FE4D1A3AD4"
   cIID = Chr( 0x3F ) + Chr( 0x10 ) + Chr( 0xAC ) + Chr( 0x50 ) + ;
          Chr( 0x35 ) + Chr( 0xD2 ) + Chr( 0x98 ) + Chr( 0x45 ) + ;
          Chr( 0xBB ) + Chr( 0xEF ) + Chr( 0x98 ) + Chr( 0xFE ) + ;
          Chr( 0x4D ) + Chr( 0x1A ) + Chr( 0x3A ) + Chr( 0xD4 )

   RoGetActivationFactory( pString, cIID, @pToastFactory )
   WindowsDeleteString( pString );

   // pFactory->GetTemplateContent( ... )
   WinRTMethod( pToastFactory, 9, 3, @pXml ) // 9: Ninth method, 3: fourth template

   pString = WinRTString( "text" )
   // pXML->GetElementsByTagName( ... )
   WinRTMethod( pXml, 17, pString, @pNodeList )
   WindowsDeleteString( pString )

   // pNodeList->Item( ... )
   WinRTMethod( pNodeList, 8, 0, @pNode )

   // 04124B20-82C6-4229-B109-FD9ED4662B53
   cIID = Chr( 0x20 ) + Chr( 0x4B ) + Chr( 0x12 ) + Chr( 0x04 ) + ;
          Chr( 0xC6 ) + Chr( 0x82 ) + Chr( 0x29 ) + Chr( 0x42 ) + ;
          Chr( 0xB1 ) + Chr( 0x09 ) + Chr( 0xFD ) + Chr( 0x9E ) + ;
          Chr( 0xD4 ) + Chr( 0x66 ) + Chr( 0x2B ) + Chr( 0x53 )

   pString = WinRTString( "Windows.UI.Notifications.ToastNotification" )
   RoGetActivationFactory( pString, cIID, @pNotificationFactory )
   WindowsDeleteString( pString )

   // factory->CreateToastNotification( ... );
   WinRTMethod( pNotificationFactory, 7, pXML, @pNotification )

   pString = WinRTString( "FiveTech" )
   // toastStatics->CreateToastNotifierWithId( ... );
   WinRTMethod( pToastFactory, 8, pString, @pNotifier )
   WindowsDeleteString( pString )

   // notifier->Show( ... );
   WinRTMethod( pNotifier, 7, pNotification )

   RoUninitialize()

return nil

function WinRTString( cText )

   local pString
   
   WindowsCreateString( AnsiToWide( cText ), Len( cText ), @pString )

return pString

DLL FUNCTION RoInitialize( nType AS LONG ) AS LONG PASCAL LIB "combase.dll"

DLL FUNCTION RoUninitialize() AS VOID PASCAL LIB "combase.dll"

DLL FUNCTION WindowsCreateString( cWideText AS LPSTR, nLength AS LONG, @pString AS PTR ) ;
   AS LONG PASCAL LIB "combase.dll"
   
DLL FUNCTION WindowsDeleteString( pString AS PTR ) AS LONG PASCAL LIB "combase.dll"

DLL FUNCTION RoGetActivationFactory( pString AS PTR, REFIID AS LPSTR, @pFactory AS PTR ) ;
   AS LONG PASCAL LIB "combase.dll"

#pragma BEGINDUMP

#include <Windows.h>
#include <hbapi.h>

typedef void * ( __stdcall * PMETHOD0 )( void * );
typedef void * ( __stdcall * PMETHOD1 )( void *, void * );
typedef void * ( __stdcall * PMETHOD2 )( void *, void *, void * );

HB_FUNC( WINRTMETHOD ) // pInspectable, nMethod, params...
{
   IUnknown * unknown = ( IUnknown * ) hb_parnll( 1 );
   void * pMethod = ( ( void ** ) unknown->lpVtbl )[ hb_parnl( 2 ) - 1 ];
   IUnknown * pReturn;

   switch( hb_pcount() )
   {
      case 3:
         if( HB_ISBYREF( 3 ) )
            hb_retnll( ( HB_LONGLONG ) ( ( PMETHOD1 ) pMethod )( unknown, &pReturn ) );
         else
            hb_retnll( ( HB_LONGLONG ) ( ( PMETHOD1 ) pMethod )( unknown, ( IUnknown * ) hb_parnll( 3 ) ) );
         break;

      case 4:
         if( HB_ISBYREF( 4 ) )
            hb_retnll( ( HB_LONGLONG ) ( ( PMETHOD2 ) pMethod )( unknown, ( void * ) hb_parnll( 3 ), &pReturn ) );
         else
            hb_retnll( ( HB_LONGLONG ) ( ( PMETHOD2 ) pMethod )( unknown, ( void * ) hb_parnll( 3 ), ( IUnknown * ) hb_parnll( 4 ) ) );
         break;
   }

   if( HB_ISBYREF( 3 ) )
      hb_storvnll( ( HB_LONGLONG ) pReturn, 3 );

   if( HB_ISBYREF( 4 ) )
      hb_storvnll( ( HB_LONGLONG ) pReturn, 4 );
}  

#pragma ENDDUMP


A shortcut to the EXE in the start menu must be created:

Image

Image

Image

Image
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42107
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Windows Toast notifications - second try

Postby James Bott » Tue Apr 19, 2016 12:01 am

Antonio,

Wow, color me impressed!

I'm going to try it out.

James
FWH 18.05/xHarbour 1.2.3/BCC7/Windows 10
User avatar
James Bott
 
Posts: 4840
Joined: Fri Nov 18, 2005 4:52 pm
Location: San Diego, California, USA

Re: Windows Toast notifications - second try

Postby James Bott » Tue Apr 19, 2016 12:17 am

Antonio,

I am getting errors. Any ideas?

James

Code: Select all  Expand view  RUN
Generating C source output to 'Toasts1.c'...
Done.

Lines 91, Functions/Procedures 7, pCodes 567
The system cannot find the file specified.
Embarcadero C++ 7.00 for Win32 Copyright (c) 1993-2015 Embarcadero Technologies, Inc.
Toasts1.c:
Error E2451 Toasts1.prg 110: Undefined symbol 'HB_LONGLONG' in function HB_FUN_WINRTMETHOD
Error E2451 Toasts1.prg 124: Undefined symbol 'HB_LONGLONG' in function HB_FUN_WINRTMETHOD
Error E2121 Toasts1.prg 124: Function call missing ) in function HB_FUN_WINRTMETHOD
Error E2121 Toasts1.prg 127: Function call missing ) in function HB_FUN_WINRTMETHOD
Warning W8004 Toasts1.prg 128: 'pMethod' is assigned a value that is never used in function HB_FUN_WINRTMETHOD
*** 4 errors in Compile ***
* Linking errors *

Process completed, Exit Code 0.
Execution time: 00:03.389
FWH 18.05/xHarbour 1.2.3/BCC7/Windows 10
User avatar
James Bott
 
Posts: 4840
Joined: Fri Nov 18, 2005 4:52 pm
Location: San Diego, California, USA

Re: Windows Toast notifications - second try

Postby James Bott » Tue Apr 19, 2016 12:51 am

Antonio,

I am using xHarbour: xHarbour 1.2.3 Intl. (SimpLex) (Build 20150603)

I cannot find HB_LONGLONG defined in any of the include files for this verson. Perhaps you are using Harbour instead?

These are the other two lines causing this error:

Error E2121 Toasts1.prg 124: Function call missing ) in function HB_FUN_WINRTMETHOD

if( HB_ISBYREF( 3 ) )
hb_storvnll( ( HB_LONGLONG ) pReturn, 3 );

if( HB_ISBYREF( 4 ) )
hb_storvnll( ( HB_LONGLONG ) pReturn, 4 );

James
FWH 18.05/xHarbour 1.2.3/BCC7/Windows 10
User avatar
James Bott
 
Posts: 4840
Joined: Fri Nov 18, 2005 4:52 pm
Location: San Diego, California, USA

Re: Windows Toast notifications - second try

Postby Antonio Linares » Tue Apr 19, 2016 3:12 am

James,

Please add these lines to have support for xHarbour:

#pragma BEGINDUMP

#include <Windows.h>
#include <hbapi.h>

#ifndef HB_LONGLONG
#define HB_LONGLONG long
#define hb_storvnll hb_stornl
#endif
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42107
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Windows Toast notifications - second try

Postby James Bott » Tue Apr 19, 2016 3:52 am

Antonio,

Well I don't understand, but I am getting the same errors with the new #DEFINE's.

I even looked in the PPO file and HB_LONGLONG still remains unchanged.

James
FWH 18.05/xHarbour 1.2.3/BCC7/Windows 10
User avatar
James Bott
 
Posts: 4840
Joined: Fri Nov 18, 2005 4:52 pm
Location: San Diego, California, USA

Re: Windows Toast notifications - second try

Postby Antonio Linares » Tue Apr 19, 2016 6:23 am

James,

Please use this version:

toastb.prg
Code: Select all  Expand view  RUN
#include "FiveWin.ch"

function Main()

   local pString, cIID, pToastFactory
   local pXml, pNodeList, pNode
   local pNotification, pNotificationFactory, pNotifier

   RoInitialize( 1 )

   pString = WinRTString( "Windows.UI.Notifications.ToastNotificationManager" )

   // "50AC103F-D235-4598-BBEF-98FE4D1A3AD4"
   cIID = Chr( 0x3F ) + Chr( 0x10 ) + Chr( 0xAC ) + Chr( 0x50 ) + ;
          Chr( 0x35 ) + Chr( 0xD2 ) + Chr( 0x98 ) + Chr( 0x45 ) + ;
          Chr( 0xBB ) + Chr( 0xEF ) + Chr( 0x98 ) + Chr( 0xFE ) + ;
          Chr( 0x4D ) + Chr( 0x1A ) + Chr( 0x3A ) + Chr( 0xD4 )

   RoGetActivationFactory( pString, cIID, @pToastFactory )
   WindowsDeleteString( pString );

   // pFactory->GetTemplateContent( ... )
   WinRTMethod( pToastFactory, 9, 3, @pXml ) // 9: Ninth method, 3: fourth template

   pString = WinRTString( "text" )
   // pXML->GetElementsByTagName( ... )
   WinRTMethod( pXml, 17, pString, @pNodeList )
   WindowsDeleteString( pString )

   // pNodeList->Item( ... )
   WinRTMethod( pNodeList, 8, 0, @pNode )

   // 04124B20-82C6-4229-B109-FD9ED4662B53
   cIID = Chr( 0x20 ) + Chr( 0x4B ) + Chr( 0x12 ) + Chr( 0x04 ) + ;
          Chr( 0xC6 ) + Chr( 0x82 ) + Chr( 0x29 ) + Chr( 0x42 ) + ;
          Chr( 0xB1 ) + Chr( 0x09 ) + Chr( 0xFD ) + Chr( 0x9E ) + ;
          Chr( 0xD4 ) + Chr( 0x66 ) + Chr( 0x2B ) + Chr( 0x53 )

   pString = WinRTString( "Windows.UI.Notifications.ToastNotification" )
   RoGetActivationFactory( pString, cIID, @pNotificationFactory )
   WindowsDeleteString( pString )

   // factory->CreateToastNotification( ... );
   WinRTMethod( pNotificationFactory, 7, pXML, @pNotification )

   pString = WinRTString( "FiveTech" )
   // toastStatics->CreateToastNotifierWithId( ... );
   WinRTMethod( pToastFactory, 8, pString, @pNotifier )
   WindowsDeleteString( pString )

   // notifier->Show( ... );
   WinRTMethod( pNotifier, 7, pNotification )

   RoUninitialize()

return nil

function WinRTString( cText )

   local pString
   
   WindowsCreateString( AnsiToWide( cText ), Len( cText ), @pString )

return pString

DLL FUNCTION RoInitialize( nType AS LONG ) AS LONG PASCAL LIB "combase.dll"

DLL FUNCTION RoUninitialize() AS VOID PASCAL LIB "combase.dll"

DLL FUNCTION WindowsCreateString( cWideText AS LPSTR, nLength AS LONG, @pString AS PTR ) ;
   AS LONG PASCAL LIB "combase.dll"
   
DLL FUNCTION WindowsDeleteString( pString AS PTR ) AS LONG PASCAL LIB "combase.dll"

DLL FUNCTION RoGetActivationFactory( pString AS PTR, REFIID AS LPSTR, @pFactory AS PTR ) ;
   AS LONG PASCAL LIB "combase.dll"

#pragma BEGINDUMP

#include <Windows.h>
#include <hbapi.h>

#ifndef HB_LONGLONG
   #define HB_LONGLONG long
   #define hb_storvnll hb_stornl
#endif

typedef void * ( __stdcall * PMETHOD0 )( void * );
typedef void * ( __stdcall * PMETHOD1 )( void *, void * );
typedef void * ( __stdcall * PMETHOD2 )( void *, void *, void * );

HB_FUNC( WINRTMETHOD ) // pInspectable, nMethod, params...
{
   IUnknown * unknown = ( IUnknown * ) hb_parnll( 1 );
   void * pMethod = ( ( void ** ) unknown->lpVtbl )[ hb_parnl( 2 ) - 1 ];
   IUnknown * pReturn;

   switch( hb_pcount() )
   {
      case 3:
         if( HB_ISBYREF( 3 ) )
            hb_retnll( ( HB_LONGLONG ) ( ( PMETHOD1 ) pMethod )( unknown, &pReturn ) );
         else
            hb_retnll( ( HB_LONGLONG ) ( ( PMETHOD1 ) pMethod )( unknown, ( IUnknown * ) hb_parnll( 3 ) ) );
         break;

      case 4:
         if( HB_ISBYREF( 4 ) )
            hb_retnll( ( HB_LONGLONG ) ( ( PMETHOD2 ) pMethod )( unknown, ( void * ) hb_parnll( 3 ), &pReturn ) );
         else
            hb_retnll( ( HB_LONGLONG ) ( ( PMETHOD2 ) pMethod )( unknown, ( void * ) hb_parnll( 3 ), ( IUnknown * ) hb_parnll( 4 ) ) );
         break;
   }

   if( HB_ISBYREF( 3 ) )
      hb_storvnll( ( HB_LONGLONG ) pReturn, 3 );

   if( HB_ISBYREF( 4 ) )
      hb_storvnll( ( HB_LONGLONG ) pReturn, 4 );
}  

#pragma ENDDUMP
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42107
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Windows Toast notifications - second try

Postby mastintin » Tue Apr 19, 2016 6:50 am

Antonio :shock: lo conseguiste :D .
Lo he mirado ayer y el código no estaba al alcance para mi . :(


Aprobecho el post para preguntar ? en la busqueda de entender el codigo he llegado aqui https://msdn.microsoft.com/es-es/librar ... s/mt186421
¿ como queda realmente WinRt con la salida del api UWP de microsoft ?
Gracias y perdonar que no escriba en ingles ( mi ingles es mas que pesimo :( )
User avatar
mastintin
 
Posts: 1516
Joined: Thu May 27, 2010 2:06 pm

Re: Windows Toast notifications - second try

Postby Antonio Linares » Tue Apr 19, 2016 7:28 am

Manuel,

Te digo cual ha sido la secuencia para poder programarlo:

1. Pruebo el ejemplo en C++ proporcionado por Microsoft y compruebo que funciona
2. Ese código sólo funciona con VSC2015 (no funciona con otros compiladores de C)
3. Buscando ejemplos en google encuentro un ejemplo programado en HSP (un lenguaje de programación japones)
que usa un sistema muy diferente e intento comprender como lo hacen:

viewtopic.php?p=189293#p189293

4. Consigo implementar la función WinRTMethod() que estoy convencido que es el sistema usado por HSP
5. Migro el código de Microsoft en C++ a la función WinRTMethod()
6. Milagrosamente funciona :-)

Ni idea del api UWP. De hecho, WinRT me parece una locura por su complejidad :-)

me queda por solucionar esta línea:
inputText.As( &inputTextNode );

viewtopic.php?p=189283#p189283

parece un casting de tipos: que un objeto IXmlText pase a ser un objeto IXmlNode. Aún no se cómo implementarlo.

Se agradecen sugerencias. En el siguiente post tienes la versión más actual.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42107
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Windows Toast notifications - second try

Postby Antonio Linares » Tue Apr 19, 2016 7:29 am

Works fine with Harbour and xHarbour:

Important: In order to test it, a shortcut to the EXE must be created in the start menu

toastb.prg
Code: Select all  Expand view  RUN
#include "FiveWin.ch"

#define Show                       7
#define CreateToastNotification    7
#define CreateToastNotifierWithId  8
#define Item                       8
#define GetTemplateContent         9
#define CreateTextNode            12
#define GetElementsByTagName      17
#define AppendChild               23

function Main()

   Toast( "Hello world" )

return nil

function Toast( cFirstLine )

   local pString, cIID, pToastFactory
   local pXml, pNodeList, pXmlNode, pXmlText, pXmlNodeChild
   local pNotification, pNotificationFactory, pNotifier

   RoInitialize( 1 )

   pString = WinRTString( "Windows.UI.Notifications.ToastNotificationManager" )

   // "50AC103F-D235-4598-BBEF-98FE4D1A3AD4"
   cIID = Chr( 0x3F ) + Chr( 0x10 ) + Chr( 0xAC ) + Chr( 0x50 ) + ;
          Chr( 0x35 ) + Chr( 0xD2 ) + Chr( 0x98 ) + Chr( 0x45 ) + ;
          Chr( 0xBB ) + Chr( 0xEF ) + Chr( 0x98 ) + Chr( 0xFE ) + ;
          Chr( 0x4D ) + Chr( 0x1A ) + Chr( 0x3A ) + Chr( 0xD4 )

   RoGetActivationFactory( pString, cIID, @pToastFactory )
   WindowsDeleteString( pString );

   WinRTMethod( pToastFactory, GetTemplateContent, 3, @pXml ) // 3: fourth template

   pString = WinRTString( "text" )
   WinRTMethod( pXml, GetElementsByTagName, pString, @pNodeList )
   WindowsDeleteString( pString )

   WinRTMethod( pNodeList, Item, 0, @pXmlNode )
   pString = WinRTString( "First line" )
   WinRTMethod( pXml, CreateTextNode, pString, @pXmlText )
   // pXmlText.As( ... );
   // WinRTMethod( pXmlText, 8, @pXmlNode )
   WinRTMethod( pXmlNode, AppendChild, pXmlText, @pXmlNodeChild )

   // 04124B20-82C6-4229-B109-FD9ED4662B53
   cIID = Chr( 0x20 ) + Chr( 0x4B ) + Chr( 0x12 ) + Chr( 0x04 ) + ;
          Chr( 0xC6 ) + Chr( 0x82 ) + Chr( 0x29 ) + Chr( 0x42 ) + ;
          Chr( 0xB1 ) + Chr( 0x09 ) + Chr( 0xFD ) + Chr( 0x9E ) + ;
          Chr( 0xD4 ) + Chr( 0x66 ) + Chr( 0x2B ) + Chr( 0x53 )

   pString = WinRTString( "Windows.UI.Notifications.ToastNotification" )
   RoGetActivationFactory( pString, cIID, @pNotificationFactory )
   WindowsDeleteString( pString )

   WinRTMethod( pNotificationFactory, CreateToastNotification, pXML, @pNotification )

   pString = WinRTString( cFirstLine )
   WinRTMethod( pToastFactory, CreateToastNotifierWithId, pString, @pNotifier )
   WindowsDeleteString( pString )

   WinRTMethod( pNotifier, Show, pNotification )

   RoUninitialize()

return nil

function WinRTString( cText )

   local pString
   
   WindowsCreateString( AnsiToWide( cText ), Len( cText ), @pString )

return pString

DLL FUNCTION RoInitialize( nType AS LONG ) AS LONG PASCAL LIB "combase.dll"

DLL FUNCTION RoUninitialize() AS VOID PASCAL LIB "combase.dll"

DLL FUNCTION WindowsCreateString( cWideText AS LPSTR, nLength AS LONG, @pString AS PTR ) ;
   AS LONG PASCAL LIB "combase.dll"
   
DLL FUNCTION WindowsDeleteString( pString AS PTR ) AS LONG PASCAL LIB "combase.dll"

DLL FUNCTION RoGetActivationFactory( pString AS PTR, REFIID AS LPSTR, @pFactory AS PTR ) ;
   AS LONG PASCAL LIB "combase.dll"

#pragma BEGINDUMP

#include <Windows.h>
#include <hbapi.h>

#ifndef HB_LONGLONG
   #define HB_LONGLONG long
   #define hb_storvnll hb_stornl
#endif

typedef void * ( __stdcall * PMETHOD0 )( void * );
typedef void * ( __stdcall * PMETHOD1 )( void *, void * );
typedef void * ( __stdcall * PMETHOD2 )( void *, void *, void * );

HB_FUNC( WINRTMETHOD ) // pInspectable, nMethod, params...
{
   IUnknown * unknown = ( IUnknown * ) hb_parnll( 1 );
   void * pMethod = ( ( void ** ) unknown->lpVtbl )[ hb_parnl( 2 ) - 1 ];
   IUnknown * pReturn;

   switch( hb_pcount() )
   {
      case 3:
         if( HB_ISBYREF( 3 ) )
            hb_retnll( ( HB_LONGLONG ) ( ( PMETHOD1 ) pMethod )( unknown, &pReturn ) );
         else
            hb_retnll( ( HB_LONGLONG ) ( ( PMETHOD1 ) pMethod )( unknown, ( IUnknown * ) hb_parnll( 3 ) ) );
         break;

      case 4:
         if( HB_ISBYREF( 4 ) )
            hb_retnll( ( HB_LONGLONG ) ( ( PMETHOD2 ) pMethod )( unknown, ( void * ) hb_parnll( 3 ), &pReturn ) );
         else
            hb_retnll( ( HB_LONGLONG ) ( ( PMETHOD2 ) pMethod )( unknown, ( void * ) hb_parnll( 3 ), ( IUnknown * ) hb_parnll( 4 ) ) );
         break;
   }

   if( HB_ISBYREF( 3 ) )
      hb_storvnll( ( HB_LONGLONG ) pReturn, 3 );

   if( HB_ISBYREF( 4 ) )
      hb_storvnll( ( HB_LONGLONG ) pReturn, 4 );
}  

#pragma ENDDUMP
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42107
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Windows Toast notifications - second try

Postby mastintin » Tue Apr 19, 2016 7:42 am

Antonio lo digo porque por lo leido el api UWP es mucho mas facil que winrt y ademas parece que es su sustituto ( eso entiendo ) , ha sido introducido en win10 y me da que le da un tiro en la cabeza al winrt. Poca vida le han dado ...

http://stackoverflow.com/questions/3198 ... nd-windows
User avatar
mastintin
 
Posts: 1516
Joined: Thu May 27, 2010 2:06 pm

PreviousNext

Return to FiveWin for Harbour/xHarbour

Who is online

Users browsing this forum: Willi Quintana, wilsongamboa and 28 guests