2015年7月29日 星期三

IE瀏覽器當VLC播放rtsp串流時切換頁面無回應的解決方法(onclick、onunload、herf優先順序)

今天在弄網頁的部分,網頁的內容有用到內嵌VLC,使用的Browser是IE

遇到一個很頭痛的問題是,當要從播放RTSP的VLC頁面中切換到別的頁面時,總是會造成IE Hang住,然後IE無回應 這時候IE只能強制關閉,然後重開。

猜想是因為離開頁面時,應該要呼叫VLC的Stop function先停止,再進行切換的動作。

先說明我網頁的架構如下圖所示,整個網頁有作分割式窗,上面小視窗的連結(herf)點擊之後,會在下面的main_Frame切換到超連結的頁面。另外每個Herf的區塊都有作自己要處理的onclick() function。
















後來我查了一些資料得知,當頁面要離開到別的頁面時,javascript的部分會去作windows.onunload() 函式,因此我就把這個VLC的Stop function加入在這個onunload()當中。但後來發現情況並沒有改善。

在查詢了一些資料後,又有一個重大發現,原來onclick()、onunload()、herf這三個東西是有一個優先順序的,動作的先後順序為 onclick() => onunload() => herf

因此我把VLC的Stop function加入到架構圖中的上面三個的onclick事件要做的function當中,就解決了這個IE瀏覽器當VLC播放rtsp串流時切換頁面無回應的問題。

下面程式碼為javascript,附上javascript在mainFrame以及topFrame分別要呼叫VLC stop的程式碼:

=============== mainFrame 的 javascript部分 ==============
function getVLC(name)  
{  
        if (window.document[name])    
        {  
                return window.document[name];  
        }  
        if (navigator.appName.indexOf("Microsoft Internet")==-1)  
        {  
                if (document.embeds && document.embeds[name])  
                        return document.embeds[name];    
        }  
        else  
        {  
                return document.getElementById(name);  
        }  
}  

getVLC("vlc").playlist.stop();





=============== topFrame 的 javascript部分 ==============
function getVLC(name)  
{  
        if (self.parent.frames["mainFrame"].document[name])    
        {  
                return self.parent.frames["mainFrame"].document[name];  
        }  
        if (navigator.appName.indexOf("Microsoft Internet")==-1)  
        {  
                if (self.parent.frames["mainFrame"].embeds && self.parent.frames["mainFrame"].document.embeds[name])  
                        return self.parent.frames["mainFrame"].document.embeds[name];    
        }  
        else  
        {  
                return self.parent.frames["mainFrame"].document.getElementById(name);  
        }  
}  

getVLC("vlc").playlist.stop();




2015年7月21日 星期二

cross compiler openssl遇到的 target already defined - linux-elf (offending arg: CC=arm-linux-gcc) 問題~

今天在研究openssl,準備針對抓下來的opensource作cross compiler。

openssl的下載點(OPENSSL),我抓的版本為openssl-1.0.2a。

首先解開壓縮包之後,先作configure的動作,指令如下:

#./config CC=arm-linux-gcc

但不知道為什麼,一直出現下面的訊息,導致config無法完成
==>  target already defined - linux-elf (offending arg: CC=arm-linux-gcc)



後來把指令改了一下,可以運作的指令如下:

#CC=arm-linux-gcc ./config no-asm shared



成功編譯完成的openssl執行檔會在 apps資料夾中

2015年7月1日 星期三

可變參數的function實作

由於最近寫的程式常常需要用到strcat ,而且一次要把好多個值strcat在一起

因此對可變參數的函式作了小小的研究,並寫成function以便日後使用


================== 正題開始 =================

在C/C++中,有所謂的variant argument(變動引數)。也就是可以讓函數
使用數量不固定的引數。printf()就是這類的函數。

定義一個函數的prototype(原型)時,若是將參數列以"..."代入,就表示這個函數即將
使用variant argument。如:

danny_func(char *result,  ...)

這樣子便可讓編繹器不檢驗傳入這種函數裡的引數型態和數量,編出來的程式碼在呼叫端
就能夠盡可能地把各式各樣引數傳入。


那麼,在如此的程式裡,要怎麼存取variant argument呢?因為缺少引數變數,所以我們
不可能像一般程式一樣直接存取它們,而是要改用stdarg.h裡面所提供的三個巨集與一個
型別,分別是:

va_list: 宣告一個指標,讓它指向引數串列。
va_start: 初始化這個指標,讓它真正指向正確的引數串列開頭。
va_arg: 來取得va_list中的資料。
va_end: 清除這個指標,把它設為NULL。範例如下:

因此打算實作一個 danny_strcat(char *result,  ...) 這樣子的function。

首先還是必須先使用到上面介紹的 linux當中的這些函式。




實作範例如下:
================= danny_strcat.c ====================
#include <stdio.h>
#include <string.h>
#include <stdarg.h>

void danny_strcat(char *result,  ...)
{
     va_list ap;
     char *p;
     va_start(ap, result);
     p = va_arg(ap, char *);

     while (p != NULL) {
      strcat(result, p);
      p = va_arg(ap, char*);
     }
     va_end(ap);
}

int main(void)

{
     char tmp[512]={0};
     char tmp2[32]="strcat";
     danny_strcat(tmp, "hello-", "world-", "danny-", tmp2, NULL);
     printf("In main tmp=%s\n",tmp);
     return 0;
}


輸出結果:






*目前的作法- 當呼叫這個可變參數的函式時,使用者必須在參數的最後面加上NULL,來告知它結束的點。