disphelper

Disphelper is a COM helper library that can be used in plain C. No MFC or 
ATL is required. It allows you to call COM objects with an easy printf 
style syntax.

Website: http://disphelper.sourceforge.net/
Platforms supported: Win32, Linux (using WINE)
Headers to include: disphelper/disphelper.bi
Header version: from 2005

Example
   '' HTTP GET example, using MSXML2

   #define UNICODE
   #include "disphelper/disphelper.bi"

   DISPATCH_OBJ(objHTTP)

   dhInitialize(True)
   dhToggleExceptions(True)

   dhCreateObject("MSXML2.XMLHTTP.4.0", NULL, @objHTTP)

   dhCallMethod(objHTTP, ".Open(%s, %s, %b)", "GET", "http://sourceforge.net", False)
   dhCallMethod(objHTTP, ".Send")

   Dim As ZString Ptr szResponse
   dhGetValue("%s", @szResponse, objHTTP, ".ResponseText")

   Print "Response: "; *szResponse
   dhFreeString(szResponse)

   SAFE_RELEASE(objHTTP)
   dhUninitialize(True)

   '' IExplorer example

   #define UNICODE
   #include "disphelper/disphelper.bi"

   Sub navigate(ByRef url As String)
      DISPATCH_OBJ(ieApp)
      dhInitialize(True)
      dhToggleExceptions(True)

      dhCreateObject("InternetExplorer.Application", NULL, @ieApp)
      dhPutValue(ieApp, "Visible = %b", True)
      dhCallMethod(ieApp, ".Navigate(%s)", url)

      SAFE_RELEASE(ieApp)
      dhUninitialize(True)
   End Sub

      navigate("www.freebasic.net")

   '' VB Script example

   #define UNICODE
   #include "disphelper/disphelper.bi"

   '' This function runs a script using the MSScriptControl.
   '' Optionally returns a result.
   Sub RunScript _
      ( _
         ByVal result_identifier As LPWSTR, _
         ByVal result As LPVOID, _
         ByVal script As LPWSTR, _
         ByVal language As LPWSTR _
      )

      DISPATCH_OBJ(control)
      If (SUCCEEDED(dhCreateObject("MSScriptControl.ScriptControl", NULL, @control))) Then
         If (SUCCEEDED(dhPutValue(control, ".Language = %T", language))) Then
            dhPutValue(control, ".AllowUI = %b", True)
            dhPutValue(control, ".UseSafeSubset = %b", False)

            If (result) Then
               dhGetValue(result_identifier, result, control, ".Eval(%T)", script)
            Else
               dhCallMethod(control, ".Eval(%T)", script)
            End If
         End If
      End If

      SAFE_RELEASE(control)
   End Sub

      dhInitialize(True)
      dhToggleExceptions(True)

      '' VBScript sample
      RunScript(NULL, NULL, !"MsgBox(\"This Is a VBScript test.\" & vbcrlf & \"It worked!\",64 Or 3)", "VBScript")

      '' JScript sample
      Dim As Integer result
      RunScript("%d", @result, "Math.round(Math.pow(5, 2) * Math.PI)", "JScript")
      Print "Result ="; result

      Print "Press any key to exit..."
      Sleep

      dhUninitialize(True)

