Page 3 of 6

Re: Windows Toast notifications - second try

PostPosted: Sun Apr 17, 2016 6:41 pm
by ukoenig
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

Re: Windows Toast notifications - second try

PostPosted: Sun Apr 17, 2016 10:04 pm
by Silvio.Falconi
here give me an error error loading combase.dll

Re: Windows Toast notifications - second try

PostPosted: Sun Apr 17, 2016 10:16 pm
by Antonio Linares
Silvio,

What Windows version are you using ?

You have to use Windows 10

Re: Windows Toast notifications - second try

PostPosted: Mon Apr 18, 2016 4:25 pm
by Antonio Linares
Borland Windows 10 Toasts support is (slowly) moving forward...

Code: Select all  Expand view
#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

Re: Windows Toast notifications - second try

PostPosted: Mon Apr 18, 2016 8:46 pm
by Antonio Linares
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
#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

Re: Windows Toast notifications - second try

PostPosted: Tue Apr 19, 2016 12:01 am
by James Bott
Antonio,

Wow, color me impressed!

I'm going to try it out.

James

Re: Windows Toast notifications - second try

PostPosted: Tue Apr 19, 2016 12:17 am
by James Bott
Antonio,

I am getting errors. Any ideas?

James

Code: Select all  Expand view
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

Re: Windows Toast notifications - second try

PostPosted: Tue Apr 19, 2016 12:51 am
by James Bott
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

Re: Windows Toast notifications - second try

PostPosted: Tue Apr 19, 2016 3:12 am
by Antonio Linares
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

Re: Windows Toast notifications - second try

PostPosted: Tue Apr 19, 2016 3:52 am
by James Bott
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

Re: Windows Toast notifications - second try

PostPosted: Tue Apr 19, 2016 6:23 am
by Antonio Linares
James,

Please use this version:

toastb.prg
Code: Select all  Expand view
#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

Re: Windows Toast notifications - second try

PostPosted: Tue Apr 19, 2016 6:50 am
by mastintin
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 :( )

Re: Windows Toast notifications - second try

PostPosted: Tue Apr 19, 2016 7:28 am
by Antonio Linares
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.

Re: Windows Toast notifications - second try

PostPosted: Tue Apr 19, 2016 7:29 am
by Antonio Linares
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
#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

Re: Windows Toast notifications - second try

PostPosted: Tue Apr 19, 2016 7:42 am
by mastintin
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