如何将form作为参数传递给delphi 5中c#中创建的dll函数

时间:2017-04-11 10:23:33

标签: delphi

如何将delphi表单作为参数传递给c#中创建的dll函数。我想将表单作为参数传递给函数。 错误是: 不兼容的类型:'类参考'和' _Form'

c#c​​ode:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace s3
{
    //g1b572e8-7888-47e4-98t1-fe0e15855r32

    [Guid("e1b572e8-7888-47e4-98e1-fe0e15855f49"),InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [ComVisible(true)]
    public interface setmonitorwindow
    {
         void Concatenate([MarshalAs(UnmanagedType.LPWStr)] Form f1);
    }



    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Form1 f2 = this;

            Class1 c1 = new Class1();
            c1.Concatenate(f2);

        }
    }




    [Guid("76663fdc-8bb8-4e68-82j5-a110aa3c0uf2"),ClassInterface(ClassInterfaceType.AutoDual)]
    [ComVisible(true)]
    public class Class1 : setmonitorwindow
    {


        [return: MarshalAs(UnmanagedType.SysInt)]
     public void Concatenate([MarshalAs(UnmanagedType.LPWStr)] Form f1) //this function i wan call
        {

            var screen1 = Screen.FromPoint(Cursor.Position);
            f1.StartPosition = FormStartPosition.Manual;
            f1.Left = screen1.Bounds.Left + screen1.Bounds.Width / 2 - f1.Width / 2;
            f1.Top = screen1.Bounds.Top + screen1.Bounds.Height / 2 - f1.Height / 2;

        }
    }
}

delphi代码:

begin
    objsetmonitor := CoClass1.Create;
    objsetmonitor.Concatenate(TForm1);  
    Form2.Show;
end;

我也按照DavidHeffernan Sir的说明尝试了其他方式如下:

我实现以下代码:

    Function MonitorFromWindow(hwnd: HWND;dwFlags:DWORD):HWND; stdcall; external 'User32.dll';
procedure TForm2.Button1Click(Sender: TObject);
begin
       result:=MonitorFromWindow(Form3.Handle,MONITOR_DEFAULTTONEAREST);
       Form3.Show;
end;                     

但现在MONITOR_DEFAULTTONEAREST是delphi 5中未声明的标识符如何声明它。还请告诉我,我正在走向正确的方向吗?

1 个答案:

答案 0 :(得分:1)

Delphi 表单 Delphi类的实例,而不是 .NET框架类。因此,任何C#代码都无法使用任何此类表单引用。

但是,您要实现的目标不需要表单对象,只需要表单所代表的桌面窗口的窗口句柄。

重写您的C#代码以接受 HWND 并将Form.WindowHandle传递给C#。然后,您可能需要使用interop来调用相应的Win32 API函数来处理该窗口句柄。

话虽如此,你想要实现的东西在Delphi应用程序本身应该是直截了当的,不需要任何外部代码,更不用说C#了。唯一的复杂因素是您的Delphi版本( Delphi 5 )不直接支持 MonitorFromPoint()方法。

实现一个并不是特别困难,但如果你在C#空间中感觉更舒服,那么这可能是继续沿着当前路径前进的原因(但使用 HWND ),除非你能得到帮助在Delphi中实现所需的代码。