Friday, October 29, 2010

How to open a form in a running Ax client from an external application

Some times ago someone asks me if it possible to open form in running Dynamics Ax application with external code. He don’t want to use AxPath for some reason.
I recalled there is a similar thing in Ax (since version 4.0) – when you receive an event alert message you can click an a link and go to the corresponding alert.
The idea was to reuse alert handling code as much as possible. And I achieved that without changing Ax code at all.
How alert links work?
1. When you start Ax32.exe, it runs the EventDrillDownPoller class, that creates a named pipe with name like “Dynamics\Event\0S-1-5-5-0-686394” (you can use pipelist utility from the SysInternals suite to obtain exact name of your named pipe) where
  • Dynamics\Event\ – is a constant prefix
  • 0 – is a value from the “Drill Down target” field in the “Basic\Setup\Alert\Alert parameters” form
  • S-1-5-5-0-686394 – is a user system session ID
and then time is being initialized, handler of the timer polls named pipe and executes SysStartupCmd descendant when message received.
You can look at \Classes\EventDrillDownPoller\scheduledPoll code to see the details.
2. When you click on the link in e-mail, axhlink.exe protocol handler is executed, it parses url and connects the named pipe obtaining it’s name using “Drill down target” from url and current session id. Then it writes a command to the named pipe.
3. When timeout handler (which was subscribed to the times in 1.) detects there is a new message in the pipe, it just runs a SysStartupCmd and then recreates a named pipe (see \Classes\EventDrillDownPoller\scheduledPoll – unfortunately it uses the current company to detect a drill down target, so if you have different values of the field in different companies ad user changes the current company, you can see it recreating a named pipe with a different name – it can cause mistakes)
So the task is pretty simple
  • Create an autorun startup command configuration file
  • Connect to the named pipe using session id and provided drill down target
  • Write a zero terminated Unicode string with a startup command to the pipe
You can download code example here

Contents:
  • C# sources of sending a message  (command line utility that takes startup command and drop target ID)
  • XML file example
  • XPO with modification for autorun startup command code, adding a parameter to navigate to a specific record (that was additional requirement – it takes table and recID attributes)

6 comments:

  1. Hi Max

    Interesting article.

    I tried your example but can't make it work.
    - Have imported the SYSAutoRun class
    - Moved the 1.XML to c:\
    - Restarted AX client
    - Runned the C# code

    Result: C# code stands at pipe.connect() - no reacation from AX client. What I'm doing wrong?

    Some other questions: What if AX is not running currently, and what if severals clients are running?

    Thanks for response.
    Regards
    Patrick

    ReplyDelete
  2. Hi Luegisdorf,

    Check the pipe name in Ax match the pipe name from С#.

    Check the drill down target in command line is equal to one in default ax company.

    In case of several clients, only the first running client will create a pipe.

    Note, you can set differe nt "Drill down targets" to different companies

    ReplyDelete
  3. The download link is broken, could you re-upload somewhere?

    Thanks!

    ReplyDelete
  4. Download link is broken, could you repost?

    Thanks.

    ReplyDelete
  5. Download link is broken, could you repost?

    Thanks.

    ReplyDelete
  6. Try this link:

    https://t57xbg.sn2.df.livefilestore.com/y1pFc9Yv2GlO6EPU35VM2-ZhFdViB_wEBVrtnO6QTEyqqJx8IAkf06GapDdkRZ-qqQT15Zo51Z_EIU4sH0WLVZiig/RunStartupCmd.zip?download&psid=1

    Or use the skydrive folder:
    https://skydrive.live.com/?cid=79df712da7ec4403&id=79DF712DA7EC4403%21862

    ReplyDelete