http://mixy.egloos.com/953406
/// <summary>
/// See Internet SDK, IObjectSafety.
/// </summary>
[Flags]
public enum ObjectSafetyFlags : int
{
/// <summary>
/// Caller of interface may be untrusted
/// </summary>
INTERFACESAFE_FOR_UNTRUSTED_CALLER = 1,
/// <summary>
/// Data passed into interface may be untrusted
/// </summary>
INTERFACESAFE_FOR_UNTRUSTED_DATA = 2,
/// <summary>
/// Object knows to use IDispatchEx.
/// </summary>
INTERFACE_USES_DISPEX = 4,
/// <summary>
/// Objects knows to use IInternetHostSecurityManager.
/// </summary>
INTERFACE_USES_SECURITY_MANAGER = 8,
/// <summary>
/// Flags combination.
/// </summary>
SafeForScripting = INTERFACESAFE_FOR_UNTRUSTED_CALLER |
INTERFACESAFE_FOR_UNTRUSTED_DATA
}
[ComImport]
[Guid("CB5BDC81-93C1-11cf-8F20-00805F3CD064")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IObjectSafety
{
void GetInterfaceSafetyOptions(ref Guid riid, out int supportedOptions, out int enabledOptions);
void SetInterfaceSafetyOptions(ref Guid riid, int optionSetMask, int enabledOptions);
}
[Guid("5E603C7D-4B7C-412a-BAB4-064E5674F97A")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
[ComVisible(true)]
public interface IActiveXControl_Method
{
[DispId(1)]
string dispFunction(string str);
}
[ProgId("TestServer.ActiveX")]
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
[Guid("D2BD9E76-C60B-4724-B44E-986132D8FA7A")]
public partial class Server : UserControl, IActiveXControl_Method, IObjectSafety
{
#region For Registration
[ComRegisterFunction()]
public static void RegisterClass(string key)
{
//Strip off HKEY_CLASSES_ROOT\ from the passed key as I don't need it
StringBuilder sb = new StringBuilder(key);
sb.Replace(@"HKEY_CLASSES_ROOT\", "");
//Open the CLSID\{guid} key for write access
RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(), true);
//And create the 'Control' key - this allows it to show up in
//the ActiveX control container
RegistryKey ctrl = k.CreateSubKey("Control");
ctrl.Close();
//Next create the CodeBase entry - needed if not string named and GACced.
RegistryKey inprocServer32 = k.OpenSubKey("InprocServer32", true);
inprocServer32.SetValue("CodeBase", Assembly.GetExecutingAssembly().CodeBase);
inprocServer32.Close();
//Finally close the main key
k.Close();
}
[ComUnregisterFunction()]
public static void UnregisterClass(string Key)
{
StringBuilder sb = new StringBuilder(Key);
sb.Replace(@"HKEY_CLASSES_ROOT\", "");
//Open HKCR\CLSID\{guid} for write access
RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(), true);
//Delete the 'Control' key, but don't throw an exception if it does not exist
k.DeleteSubKey("Control", false);
//Next open InprocServer32
RegistryKey inprocServer32 = k.OpenSubKey("InprocServer32", true);
//And delete the CodeBase key, again not throwing if missing
k.DeleteSubKey("CodeBase", false);
//Finally close the main key
k.Close();
}
#endregion
#region IObjectSafety 멤버
public void GetInterfaceSafetyOptions(ref Guid riid, out int supportedOptions, out int enabledOptions)
{
supportedOptions = enabledOptions = (int)ObjectSafetyFlags.SafeForScripting;
}
public void SetInterfaceSafetyOptions(ref Guid riid, int optionSetMask, int enabledOptions)
{
}
#endregion
string m_strSavePath = System.Environment.GetFolderPath(Environment.SpecialFolder.Templates);
public Server()
{
InitializeComponent();
}
#region IActiveX_Method
public string dispFunction(string str)
{
string strRes;
return strRes;
}
#endregion
}