Platform Frequently Asked Questions


Do servers and clients written using the Remoting SDK only work on Windows?

Remoting SDK for Delphi works on Windows, MacOS, Linux, Android and iOS Simulator. Remoting SDK for .NET works on Windows, Windows CE/PocketPC, Linux and MacOS with Mono.


How can I access a webbroker project's web datamodule?

This depends on the base class of your service.

procedure GetDispatchInfo(const aTransport : IROTransport; const aMessage : IROMessage);

Save it in a instance field:

fMyModule := (aTransport.GetTransportObject as TComponent).Owner as TMyModuleType
  • For a TRORemoteDataModule descendant, you can use the following from anywhere, as it saves the transport for you:
(Transport.GetTransportObject as TComponent).Owner as TMyModuleType

How can I connect emulated Pocket PC and host?

Here are the steps needed to establish a connection between an emulated PocketPC device and the host computer:

  • Install (or have installed) Microsoft Windows Mobile Device Center.
  • Enable DMA connections (launch Windows Mobile Device Center and open Mobile Device Settings -> Connection settings, and check the Allow connections to one of the following: option with DMA selected in dropdown box below).
  • Open the Device Emulator Manager using the Tools -> Device Emulator Manager... menu item in Visual Studio.
  • Find your emulator and set it into Cradle Mode (by using the context menu on your emulator).
  • When Microsoft Windows Mobile Device Center has established communication, choose Guest partnership.
  • Run the client.

How can I create a Windows Service-based Remoting SDK for .NET server?

You can find an article describing how to create a Windows Service-based Remoting SDK for .NET servers here.


How can I decrease extra latency (about 200 ms) in Windows 7?

Extra latency in Windows 7 is caused by the nagle algorithm, which is enabled by default. It can be disabled using the Windows API (TCP_NODELAY): http://msdn.microsoft.com/en-us/library/ms740476(VS.85).aspx.

In Indy, it can be disabled by setting the property DisableNagle to True.


How can I enable debugging of Remoting SDK for .NET sources?

To enable debugging of Remoting SDK for .NET or DataAbstract for .NET sources you have to do the following steps:

  • Open solution.
  • Open Debug->Debugging->General and turn off options Enable Just My Code (Managed only) and Step over properties and operators (Managed only)
  • Open Debugging->Symbols and add new symbol file (.pdb) location. It should point to Remoting SDK (or DataAbstract) assemblies (f.e. C:\Program Files\RemObjects Software\RemObjects SDK for .NET\Bin).

Please note that path should be the same as path to Remoting SDK assemblies in References.

  • Add breakpoint under the line which you want to debug.
  • Run application.
  • Open Debug->Windows->Modules. You will see used assemblies.
  • Open context menu for one of SDK or DataAbstract assemblies and issue Load Symbols From->Symbol Path.
  • After this on breakpoint click F11 and you will debug Remoting SDK source code.

How can I expose one or more services using SuperHttpWebProcessor (.NET)?

To be able to to use server events you should also create a MemoryMessageQueueManager and an EventSinkManager in SuperHttpWebProcessor constructor.

This is the full source code (C#) of WebHandler that provides the Remoting SDK service via a SuperHttp channel:

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Services;

namespace Testcase
{
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    public class RO : IHttpHandler, IHttpAsyncHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            SuperHttpFactory.Instance.ProcessRequest(context);
        }

        public Boolean IsReusable
        {
            get
            {
                return false;
            }
        }

        #region IHttpAsyncHandler Members
        public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
        {
            return SuperHttpFactory.Instance.BeginProcessRequest(context, cb, extraData);
        }

        public void EndProcessRequest(IAsyncResult result)
        {
            SuperHttpFactory.Instance.EndProcessRequest(result);
        }
        #endregion
    }


    public class SuperHttpFactory : RemObjects.SDK.Server.Web.SuperHttpWebProcessor
    {
        private static SuperHttpFactory fInstance = new SuperHttpFactory();

        private RemObjects.SDK.Server.MemorySessionManager fSessionManager =
            new RemObjects.SDK.Server.MemorySessionManager();
        private RemObjects.SDK.Server.MemoryMessageQueueManager fMessageQueue =
            new RemObjects.SDK.Server.MemoryMessageQueueManager();
        private RemObjects.SDK.Server.EventSinkManager fEventSinkManager =
            new RemObjects.SDK.Server.EventSinkManager();


        public static SuperHttpFactory Instance
        {
            get
            {
                return SuperHttpFactory.fInstance;
            }
        }

        public SuperHttpFactory()
        {
            this.ServeRodl = true;

            RemObjects.SDK.BinMessage lMessage = new RemObjects.SDK.BinMessage();
            this.Dispatchers.Add("bin", lMessage);
            this.fEventSinkManager.Message = lMessage;
            this.Active = true;
        }
    }
}

Note: You have to ensure that assembly containing service classes is loaded into the AppDomain. If service was created in separate assembly you could instantiate one of service classes in SuperHttpFactory constructor or explicitly register service type in ServiceManager.


How can I rebuild Remoting SDK for .NET assemblies (.NET)?

  • Generate a cryptographic key pair using commands:
sn -k RemObjectsSoftware
sn -i RemObjectsSoftware RemObjectsSoftware

sn here is the .NET Framework Strong Name Utility.

  • Open the RemObjects.SDK.YYYY.sln solution file in Visual Studio.
  • Make the source code changes you need.
  • Rebuild the solution.
  • Reference self-built Remoting SDK assemblies. Note that Copy Local property for these references should be set to true. Also please take in account that self-build assemblies don't provide full design-time support.

How can I start Windows Service-based server created using Remoting SDK Trial version?

Set service's logon account to Local System and be sure to check the Allow service to interact with the desktop box.


What types have to be used to pass strings and booleans in cross platform environment?

For booleans you should use LongBool, for strings - WideString (in the unmanaged code).

Another option is to use the MarshalAs attribute in the managed code.

As an example:

  public interface IUnmanagedInterface : IHYCrossPlatformInterface {
      void SetIntValue(int AValue);
      int GetIntValue();

      void SetBoolValue([MarshalAs(UnmanagedType.Bool)] bool AValue);
      [return: MarshalAs(UnmanagedType.Bool)] bool GetBoolValue();

      void SetStringValue([MarshalAs(UnmanagedType.AnsiBStr)] string AValue);
      [return: MarshalAs(UnmanagedType.AnsiBStr)] string GetStringValue();
}

Why TypeManager.TypesAssembly is not assigned for non-.NET platforms (ie Compact Framework, Silverlight, WindowsPhone7, MonoTouch etc)?

This is as designed. You have to explicitly the TypesAssembly property because these frameworks doesn't provide any way for the Remoting SDK to know what assembly to search for your types.

You can do this pretty much anywhere (for example in your Main() method, like this:

TypeManager.TypeAssemblies.Add(typeof(Form1));

Form1 is your form (but it could be any other type contained in your executable).

Note that on the desktop framework (either .NET Framework or Mono), the Remoting SDK simply searches all loaded modules for types.