Flash改變VC的界面(這裏是和Socket結合使用)

曾經在VCKbase(VC知識庫)網站看到過一篇關於Flash的文章,叫做《在VC中使用 Flash 美化你的程序》,文章中介紹的是使用Flash控件在對話框程序中播放Flash文件。由於以前的工作需要曾經接觸過使用Scoket通信在VC的Exe程序和Flash程序中通信的相關技術。在這裏介紹給大家。相比上面的那篇文章,其有一下有點:
1、 界面上更加優美。所有的界面部分都是直接使用Flash。
2、 所能完成的功能更加完備。幾乎所有能在VC的程序中能使用的功能都可以使用。
要做到以上兩點所要做的工作也是很簡單的,使用的技術也很簡單。只要求以下幾點:
1、 會使用簡單的Flash編輯工具。會寫簡單的Flash Script腳本。
2、 Socket編程的相關知識。
程序的原理就是:VC程序(對話框程序)在啓動以後最小化的任務欄,並建立一個Socket Server進行偵聽,在建立完Socket和設置好相關的處理函數以後,啓動編譯爲Exe的Flash程序,Flash程序通過Socket於VC程序建立連接,將Flash界面上的操作轉換爲Socket通信,讓VC程序處理完成以後將結果返回給Flash程序。其簡單的步驟爲:
1、 在VC程序端(或者其他任何編程語言的程序):建立一個對話框程序,在APP類的InitInstance()函數中添加Scoket初始化:
if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return FALSE;
}
2、 在對話框類的OnInitDialog()函數中添加處理界面部分的程序段:
MoveWindow(0,0,0,0); //將對話框程序界面改變爲0
ShowWindow(SW_SHOWMINIMIZED); //使界面最小化到任務欄
OnOK(); //調用對話框的OnOK函數
3、 在對話框類的OnOK()函數中建立Socket server並偵聽:
WSADATA wsaData;
    int iErrorCode;
    if (WSAStartup(MAKEWORD(2,1),&wsaData)) //Windows Sockets DLL

 AfxMessageBox("Winsock can not initialize.",MB_ICONSTOP);
         WSACleanup();
 SendMessage(WM_CLOSE,NULL,NULL);//關閉對話框程序
         return;
}

//Create server Socket,type is SOCK_STREAM,
ServerSocket = socket(PF_INET,SOCK_STREAM,0);    
    if(ServerSocket == INVALID_SOCKET)
{
AfxMessageBox("Could not create server Socket.",MB_ICONSTOP);
SendMessage(WM_CLOSE,NULL,NULL); //關閉對話框程序
         return;
}

m_sockServerAddr.sin_family = AF_INET;
//IP 設置爲廣播
    m_sockServerAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
//使用9813端口,自己編程的時候可以隨意選擇,最好使用5000以後的
    m_sockServerAddr.sin_port = htons(9813);

//綁定Socket
    if (bind(ServerSocket,(LPSOCKADDR)&m_sockServerAddr,sizeof(m_sockServerAddr)) == SOCKET_ERROR) //
    {
AfxMessageBox("Could not bind Server socket.",MB_ICONSTOP);
SendMessage(WM_CLOSE,NULL,NULL); //關閉對話框程序
        return;
}
    iErrorCode = WSAAsyncSelect(ServerSocket,m_hWnd,WM_CLIENT_ACCEPT,FD_ACCEPT);
    if (iErrorCode == SOCKET_ERROR) 
{
AfxMessageBox("Could not select socket.",MB_ICONSTOP);
    SendMessage(WM_CLOSE,NULL,NULL); //關閉對話框程序
         return;
}

    if (listen(ServerSocket,1) == SOCKET_ERROR) //begin listen client
{
AfxMessageBox("Could not listen.",MB_ICONSTOP);
SendMessage(WM_CLOSE,NULL,NULL);
        return;
}
//啓動Flash程序
CString FlashExePath;
char DialogExePath[256];
   //獲得對話框程序的路徑,包含文件名
::GetModuleFileName(0, DialogExePath, sizeof(DialogExePath));
FlashExePath = DialogExePath;
   //去除對話框程序文件名,獲得所在目錄路徑
int Len = FlashExePath.ReverseFind('\\');
FlashExePath = FlashExePath.Left(Len);
// Sample.exe爲編譯好的Flash程序,存放在和VC程序同一目錄下
FlashExePath  += "\\Sample.exe";
WinExec(FlashExePath,1);

return; 
}
相關變量定義在對話框類的頭文件中,作爲成員變量:
SOCKET Client;        //客戶的連接請求
SOCKET ServerSocket;             //SOCKET 
SOCKADDR_IN m_sockServerAddr;  //SOCKET 結構
4.在對話框程序中添加Socket的處理函數:
頭文件中添加:
#define WM_CLIENT_ACCEPT WM_USER+101
#define WM_CLIENT_READCLOSE WM_USER+102

LRESULT OnAccept(WPARAM wParam, LPARAM lParam);
LRESULT OnReadClose(WPARAM wParam,LPARAM lParam);
在CPP文件中添加消息映射宏和相關函數的實現:
ON_MESSAGE(WM_CLIENT_ACCEPT,OnAccept)
ON_MESSAGE(WM_CLIENT_READCLOSE,OnReadClose)

LRESULT CSetupDlg::OnAccept(WPARAM wParam,LPARAM lParam)
{
//出錯返回
if (WSAGETSELECTERROR(lParam))
{
return 0L;
}

if(WSAGETSELECTEVENT(lParam) == FD_ACCEPT)
{
    Client = accept(ServerSocket,(LPSOCKADDR)&m_sockServerAddr,0);

    if (Client == INVALID_SOCKET)
{
AfxMessageBox("INVALID_SOCKET.",MB_ICONSTOP);
return 0L;
}
WSAAsyncSelect(Client,m_hWnd,WM_CLIENT_READCLOSE,FD_READ|FD_CLOSE);
}

return 0L;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
LRESULT CSetupDlg::OnReadClose(WPARAM wParam,LPARAM lParam)
{   
//在這裏接收從Flash發送來的數據包,並解析它們,根據包中的數據不同通過Swith執行相//關的操作,可以調用其他的函數,需要將執行的結果返回(發送)給Flash。
CString str;
switch (WSAGETSELECTEVENT(lParam))
{
//這裏的msg和msg中的相關定義都是自定義的結構體
case FD_READ:
if(recv(Client,(char *)&msg,sizeof(msg),0) == SOCKET_ERROR)
{
return 0;
}
str.Format("%s",msg.msg);
list.InsertString(0,str);
{
PSockmsg recmsg=(PSockmsg)msg.msg; 
str=recmsg->msg;
switch(recmsg->action)
{
case 'D':
break;
case 'W':
break;
default:
}
}
break;
case FD_CLOSE:
str = _T("client close.");
closesocket(Client);//關閉Socket
SendMessage(WM_CLOSE,NULL,NULL);//發送消息結束程序
break;
}
return 0L;
}
這段函數我就不多解釋了,注意在OnOK中的WSAAsyncSelect調用確定了當收到發生Socket事件的時候發出WM_CLIENT_ACCEPT消息。第二個消息處理函數中用到了一些自定義的結構體,這是在和Flash統一以後確定的一些結構體,用於在Flash和VC程序之間傳遞消息參數的,這也是其重要的部分,需要根據實際的情況確定。

2.在Flash端:需要進行Socket連接,並組織併發送相關的Socket包,接收VC端返回的結果。參考代碼:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function onsock(success) {
        if (success) {
            _root.gotoAndPlay(2);
        } else {
            _root.gSock.connect("127.0.0.1", 9813);//連接VC程序
         }
    }
    function onsockclose() {
        fscommand ("quit");
    }
    stop();
    fscommand ("fullscreen", false);
    fscommand ("allowscale", false);
    fscommand ("showmenu", false);
    Stage.showMenu = false;
    var gSock = new XMLSocket ();//new一個Socket對象
    var installed = false;
    var usethreeside = false;
    var havewireless = false;
    var finished = false;
    var osys = true;
    var mem = true;
    var processor = true;
    var harddisk = true;
    var network = true;
    gSock.onClose = onsockclose;//指定Socket的相關回調函數
    _root.gSock.connect("127.0.0.1", 9813);//調用自定義的函數
_root.gSock.onConnect = onsock;
///////////////////////////////////////////////////////////////
//接收並判斷相關的在VC程序段執行的結果。
function onrecv(XMLDoc) {
        var _local2;
        _local2 = XMLDoc.toString();
        if (_local2 == "failed") {
            _root.osys = false;
        }
        _root.gotoAndPlay(196);
    }
    _root.stop();
    _root.gSock.onXML = onrecv;
    var local1;
    local1 = "Wcheckos";//相關的信息組織

    _root.gSock.send(local1);//發送數據




轉載路徑:http://bbs.csdn.net/topics/70418951

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章