前面讲到,新界面用delphi写,而底层程序用c++做的,且有以前的源代码,我实在不想把c++源代码转到pascal语言。怎么办?试过用dll,但是dll里面对象实在没有办法,现在只能用clipboard粘贴板实现通信,这样就可以delphi程序调用c++的底层程序。
我尝试采用文本方式,通过clipboard传递信息,函数名称和参数之间采用换行隔开,到另外一端解析里面的内容,调用相关函数就实现了程序自己的通信和调用。
delphi里面程序非常简单:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
senddata:string;
begin
clipboard.Open;
senddata:='linchao:'+#13#10+edit1.Text+#13#10+ edit2.Text+#13#10+edit3.Text;
clipboard.SetTextBuf(Pchar(senddata));
clipboard.close;
sleep(200); //等待结束
// NextClipHwnd:=SetClipBoardViewer(Handle);
end;
c++里面的程序需要增加消息处理程序:
case WM_DRAWCLIPBOARD:
if(!OpenClipboard(hWnd))//打开剪贴板
{
MessageBox(hWnd,_T("clip board open error "),_T("hi"),MB_OK);
return 0;
}
if(IsClipboardFormatAvailable(CF_TEXT))
{
HANDLE hCilpData = GetClipboardData(CF_TEXT);
DWORD Len = GlobalSize(hCilpData);
char* pData;
WCHAR clipData[1000];
pData = (char*)GlobalLock(hCilpData);//内存控制句柄加锁,其他进程不能再访问
MultiByteToWideChar(CP_ACP,0,pData,strlen(pData)+1,clipData,
sizeof(clipData)/sizeof(clipData[0]));
MessageBox(hWnd,clipData,_T("hi"),MB_OK);
GlobalUnlock(hCilpData);//内存控制句柄解锁,其他进程可以访问
}
// EmptyClipboard();//清空剪贴板,这一步才真正拥有剪贴板
CloseClipboard();//关闭剪贴板
SendMessage(m_hWndNextViewer, WM_DRAWCLIPBOARD, 0, 0);
break;
在能够接收消息前,要把消息通道处理好:
主要是使用函数记录原来的窗口消息链表
m_hWndNextViewer=SetClipboardViewer(hWnd);
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // Store instance handle in our global variable
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
m_hWndNextViewer=SetClipboardViewer(hWnd);
return TRUE;
}
最后,可以实现通过delphi发送消息给c++。