Platform Frequently Asked Questions
- Do servers and clients written using the Remoting SDK only work on Windows?
- How can I access a webbroker project's web datamodule?
- How can I connect emulated Pocket PC and host?
- How can I create a Windows Service-based Remoting SDK for .NET server?
- How can I decrease extra latency (about 200 ms) in Windows 7?
- How can I enable debugging of Remoting SDK for .NET sources?
- How can I expose one or more services using SuperHttpWebProcessor (.NET)?
- How can I rebuild Remoting SDK for .NET assemblies (.NET)?
- How can I start Windows Service-based server created using Remoting SDK Trial version?
- What types have to be used to pass strings and booleans in cross platform environment?
- Why TypeManager.TypesAssembly is not assigned for non-.NET platforms (ie Compact Framework, Silverlight, WindowsPhone7, MonoTouch etc)?
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.
- For TROService descendents: Add IRODispatchNotifier to the class and implement this procedure:
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 theTools -> 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 optionsEnable Just My Code (Managed only)
andStep 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 totrue
. 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.