If the GUI uses IDispatch::Invoke
to invoke your methods, it should be resilient to changes in the interface (as long as you keep the IDs the same), because the method calls are resolved at runtime (late binding). It is common for VB6 programs and scripting languages to operate this way.
However, if the GUI is compiled directly against IMyComInterface
(which is most likely if it's a C++ or C# app), what matters is the exact order of methods in the interface. The method calls are resolved at compile time (early binding), and the index of the method in the interface is stored in the COM client. If you delete a method from the IDL, all the function calls from the client will be off by one. This is why adding a new method at the end works, but deleting methods in the middle doesn't.
The simplest way around all these problems (since you control both the COM DLL and the GUI) is to make sure you recompile everything after changing the IDL. In the general case, though, you should treat every interface as "an immutable contract of a functional group of methods" (source), and never modify a COM interface after it has been released into the world.