Hello!
I have a liitle problem with my programm. I need to create programm that is making a AutoCAD drawing from a windows form. I Alrady got the everything done, but have one small problem: I can send command to autocad only once per my programm is running, if i try to send two commands it crushes and give me error that Call was rejected by callee. I mange to find that it is becuse of the time the send command need to go to autocad. I also find this solution http://msdn.microsoft.com/en-us/library/ms228772(VS.80).aspx from the post here http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/617a7fbf-2090-41e7-aca0-c14957d632c8/ I done the solution and it actualy work, but there is another problem now, actualy still same. The MessageFilter.Register(); works and its stops the crush and the error message are not showing, but nothing hapens, i mean the next send command aint working, it just stops working, i mean the command aint sending. Here is the piece of my code:

public void RenameLayoutu()
{
MessageFilter.Register();
acadDoc.SendCommand("_layout r Layout1");
SendKeys.Send("{ENTER}");
acadDoc.SendCommand("mylayout");
SendKeys.Send("{ENTER}");
MessageFilter.Revoke();
}

It is to rename one of the layouts in the document. First command working, then enter key sending, and after that nothing, there aint crush, programm is still runing and i can draw in autocad manualy everything is working exept sending of second command.
Thank to anyone who will help.
Best regards NILS.

I don't know what your problem is in particular, but it may be that you need to allow autocad some time to process the first command before it is ready to accept the second command.

Alternatively if you are using OLE or COM to interface with AutoCAD, you need to follow their conventions. Do you need to request status or completion status after you send the command before you can send another command?

It appears that you are using a keystroke driven interface for at least part of your control. I can't tell if SendCommand is a keystroke interface or an OLE interface, but I know SendKeys is a keystroke interface.

If SendCommand is not a keystroke interface, it would probably be in your best interest to pick a SINGLE method of interaction with AutoCAD and not try to mix metaphors.

If you are using a keystroke interface, I recall that some applications like to 'clear the keyboard buffer' prior to prompting for a new command. If AutoCAD is written this way, you will need to make sure you are not sending keystrokes to AutoCAD until it has re-prompted for a command or they will be discarded.

See if any of the above gives you a new way to look at your problem.

In this file I will give you an alternative. These are some COMS. You can send command this way. Here ENTER is /n.
If you have further questions feel free to ask.
Look at http://through-the-interface.typepad.com/. You will find a lot there.

Attachments
public static void CloseOldAcadApp()
        {
            try
            {
                Object obj = null;
                do
                {
                    obj = null;
                    obj = System.Runtime.InteropServices.Marshal.GetActiveObject("Autocad.Application");
                    if (obj != null)
                    {
                        Object docs_;
                        docs_ = obj.GetType().InvokeMember("documents",
                                             BindingFlags.DeclaredOnly |
                                             BindingFlags.Public | BindingFlags.NonPublic |
                                             BindingFlags.Instance | BindingFlags.GetProperty, null, obj, null);

                        //   opening documents
                        Object count = docs_.GetType().InvokeMember("count",
                                                            BindingFlags.DeclaredOnly |
                                                            BindingFlags.Public | BindingFlags.NonPublic |
                                                            BindingFlags.Instance | BindingFlags.GetProperty, null, docs_, null);
                        int n = (int)count;
                        Object doc_;
                        for (int i = n - 1; i > -1; i--)//save opening documents
                        {
                            doc_ = docs_.GetType().InvokeMember("item",//
                                                BindingFlags.DeclaredOnly |
                                                BindingFlags.Public | BindingFlags.NonPublic |
                                                BindingFlags.Instance | BindingFlags.InvokeMethod, null, docs_, new Object[] { i });

                            doc_.GetType().InvokeMember("save",
                                     BindingFlags.DeclaredOnly |
                                     BindingFlags.Public | BindingFlags.NonPublic |
                                     BindingFlags.Instance | BindingFlags.InvokeMethod, null, doc_, null);
                        }

                        obj.GetType().InvokeMember("quit",
                                 BindingFlags.DeclaredOnly |
                                 BindingFlags.Public | BindingFlags.NonPublic |
                                 BindingFlags.Instance | BindingFlags.InvokeMethod, null, obj, null);

                        Console.WriteLine("Quit AutoCAD Proces\nStarted New\n{0} Saved", (int)count);
                    }
                } while (obj != null);
            }
            catch
            {
                //empty
            } // AutoCad
        }       
        public void   SaveDocument()
        {
            doc.GetType().InvokeMember("save",
                BindingFlags.DeclaredOnly |
                BindingFlags.Public | BindingFlags.NonPublic |
                BindingFlags.Instance | BindingFlags.InvokeMethod, null, doc, null);
        }
        public void   SaveDocumentAs(String fName)
        {
            doc.GetType().InvokeMember("saveas",
                BindingFlags.DeclaredOnly |
                BindingFlags.Public | BindingFlags.NonPublic |
                BindingFlags.Instance | BindingFlags.InvokeMethod, null, doc, new Object[] { fName });
        }
        public void   OpenDocument(String fName)
        {
            doc =
               Documents.GetType().InvokeMember("open",
               BindingFlags.DeclaredOnly |
               BindingFlags.Public | BindingFlags.NonPublic |
               BindingFlags.Instance | BindingFlags.InvokeMethod, null, Documents, new Object[] { fName, false });

 /*          ls =
            doc.GetType().InvokeMember("layers",
                      BindingFlags.DeclaredOnly |
                       BindingFlags.Public | BindingFlags.NonPublic |
                       BindingFlags.Instance | BindingFlags.GetProperty, null, doc, null);*/
        }
        public void   GetLayers()
        {
            ls =
             doc.GetType().InvokeMember("layers",
                       BindingFlags.DeclaredOnly |
                        BindingFlags.Public | BindingFlags.NonPublic |
                        BindingFlags.Instance | BindingFlags.GetProperty, null, doc, null);
        }
This article has been dead for over six months. Start a new discussion instead.