Fortran Coder

查看: 7002|回复: 1
打印 上一主题 下一主题

[混编] Fortran与C#进程间通信 windows消息机制

[复制链接]

3

帖子

2

主题

0

精华

入门

F 币
45 元
贡献
21 点
跳转到指定楼层
楼主
发表于 2016-9-22 14:45:00 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
fortran调用API函数SendMessage,函数定义如下
[Fortran] 纯文本查看 复制代码
01FUNCTION SendMessage( &
02        hWnd, &
03        Msg, &
04        wParam, &
05        lParam)
06use ifwinty
07  integer(LRESULT) :: SendMessage ! LRESULT
08    !DEC$ ATTRIBUTES DEFAULT, STDCALL, DECORATE, ALIAS:'SendMessageA' :: SendMessage
09  integer(HANDLE) hWnd ! HWND hWnd
10  integer(UINT) Msg ! UINT Msg
11  integer(UINT_PTR) wParam ! WPARAM wParam
12  integer(LONG_PTR) lParam ! LPARAM lParam
13 END FUNCTION

COPYDATASTRUCT结构体如下:
[Fortran] 纯文本查看 复制代码
1TYPE T_COPYDATASTRUCT
2     SEQUENCE
3       integer(pointer_len) dwData ! typedefs  ULONG_PTR
4       integer(DWORD) cbData ! knowns  DWORD
5       integer(PVOID) lpData ! knowns  PVOID
6     END TYPE

[Fortran] 纯文本查看 复制代码
01program SendMsg_Fortran
02    use ifwin
03    implicit none
04    integer(LRESULT)::ret
05    integer(HANDLE)::hWnd
06    !integer,pointer::a(:)
07    real,dimension(5,3),parameter :: b = &
08       & (/0.2,0.4,0.1,0.1,0.1, &
09    &   0.1,0.1,0.1,0.8,0.1, &
10    &   0.1,0.1,0.1,0.1,0.1 /)
11 
12    type(T_COPYDATASTRUCT)::COPYDATASTRUCT
13    COPYDATASTRUCT%dwData = size(b)
14    COPYDATASTRUCT%cbData = sizeof(b)
15    COPYDATASTRUCT%lpData = loc(b)
16 
17   hWnd = FindWindow_G2(NULL,'Form1')!找句柄
18 
19   ret=SendMessage (hWnd, 74, 0, loc(COPYDATASTRUCT)) !WM_COPYDATA 74
20end program

C#接受消息并解析
C# COPYDATASTRUCT接口提定义
[C#] 纯文本查看 复制代码
1public struct COPYDATASTRUCT
2    {
3        public IntPtr dwData;
4        public int cbData;
5        public IntPtr lpData;
6    }

复写DefWndProc函数
[C#] 纯文本查看 复制代码
01const int WM_COPYDATA = 0x004A;
02        float[] ff;
03        protected override void DefWndProc(ref Message m)
04        {
05            unsafe
06            {
07                 
08                switch (m.Msg)
09                {
10                    case WM_COPYDATA:
11                        COPYDATASTRUCT myData = new COPYDATASTRUCT();//这是创建自定义信息的结构
12                        Type mytype = myData.GetType();
13                        myData = (COPYDATASTRUCT)m.GetLParam(mytype);//这里获取的就是作为LParam参数发送来的信息的结构
14                        ff = new float[(int)myData.dwData];
15                        Marshal.Copy(myData.lpData, ff, 0, (int)myData.dwData);
16                        for (int i = 0; i < ff.Length; i++)
17                        {
18                            textBox1.Text += ff[i].ToString() + "\r\n";
19                        }                   
20                        break;
21                    default:
22                        base.DefWndProc(ref m);
23                        break;
24                }
25            }
26        }

分享到:  微信微信
收藏收藏1 点赞点赞 点踩点踩

58

帖子

9

主题

0

精华

熟手

F 币
256 元
贡献
163 点
沙发
发表于 2016-11-13 06:34:27 | 只看该作者
大神怎么不用use ,Intrinsic::ISO_C_Binding?
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2025-5-1 00:51

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

快速回复 返回顶部 返回列表