0

クラスのオブジェクトをあるプログラムから別のプログラムに渡す必要があります。

これは合格する必要があるクラスです。

[StructLayout( LayoutKind.Sequential, CharSet = CharSet.Ansi )]
public class MessageContainer
{
    public bool DescFirst { get; set; }      
    [MarshalAs( UnmanagedType.ByValTStr, SizeConst = 200 )]
    public string Data;
    public decimal PriceMin { get; set; }
    public int Hidden { get; set; }

    public MessageContainer()
    {
        DescFirst = true;
    }
}

CopyDataStruct クラス;

public struct CopyDataStruct : IDisposable
        {
            public IntPtr dwData;
            public int cbData;
            public IntPtr lpData;

            public void Dispose()
            {
                if (this.lpData != IntPtr.Zero)
                {
                    LocalFree(this.lpData);
                    this.lpData = IntPtr.Zero;
                }
            }
        }

オブジェクトの送信方法;

    {
    int hwnd = -1;
    IntPtr handle = IntPtr.Zero;

    foreach (Process proc in Process.GetProcesses())
    {
        if (proc.MainWindowTitle.StartsWith("MyApp"))
        {
            handle = proc.MainWindowHandle;
        }
    }

    if (handle != IntPtr.Zero)
    {       
        Win32.CopyDataStruct cds = new Win32.CopyDataStruct();
        MessageContainer cs = new MessageContainer();
        cs.Data = "Test123";
        cds.DescFirst = true;
        cds.lpData = Marshal.AllocHGlobal(Marshal.SizeOf(cs));
        cs.PriceMin = "1.25";
        cs.Hidden = 0;

        try
        {
            Marshal.StructureToPtr(cs, cds.lpData, false);
            Win32.SendMessage(handle, Win32.WM_COPYDATA, IntPtr.Zero, ref cds);
        }
        finally
        {
            Marshal.FreeHGlobal(cds.lpData);
        }
    }
    else
        MessageBox.Show("Not send");
}

他のアプリケーションで;

protected override void WndProc(ref Message m)
        {
            switch ( m.Msg )
            {
                case Win32.WM_COPYDATA:

                    Win32.CopyDataStruct cds = (Win32.CopyDataStruct)m.GetLParam(typeof(Win32.CopyDataStruct));

                    // If the size matches
                    if ( cds.cbData == Marshal.SizeOf(typeof(MessageContainer)) )
                    {
                        MessageContainer msg = (MessageContainer)Marshal.PtrToStructure(cds.lpData, typeof(MessageContainer));
                        if ( msg != null )
                        {
                            TextBox1.text = msg.Data;
                        }
                    }
                    break;
                default:
                    // let the base class deal with it
                    base.WndProc(ref m);
                    break;
            }
        }

ターゲット アプリケーションで、"string" データ型 ("Test123") 以外のすべてのデータを取得します。「データ」を空白にします。

エラーはありません。両方のアプリケーションが動作します。オブジェクトは転送されますが、文字列変数にはデータがありません。

これについて私を助けてください

4

0 に答える 0