Thursday, February 19, 2009

Dev C++ Dynamic-Link Library

因為朋友詢問如何利用Dev C++的環境去Build一個DLL出來,所以就開始動手試試看,也在Google上爬了一些文,有了一點點心得,以下是我測試出來的結果:

在一開始動手,我們使用Dev C++去開啟一個DLL的專案,而開啟的這個專案裡面就會有基本的Hello World DLL版本如下:

dll.h:
#ifndef _DLL_H_
#define _DLL_H_

#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else
# define DLLIMPORT __declspec (dllimport)
#endif

DLLIMPORT void HelloWorld (void);

#endif

dllmain.c:
#include "dll.h"
#include < windows.h >
#include < stdio.h >
#include < stdlib.h >

DLLIMPORT void HelloWorld ()
{
MessageBox (0, "Hello World from DLL!\n", "Hi", MB_ICONINFORMATION);
}


BOOL APIENTRY DllMain (HINSTANCE hInst ,
DWORD reason ,
LPVOID reserved )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
break;

case DLL_PROCESS_DETACH:
break;

case DLL_THREAD_ATTACH:
break;

case DLL_THREAD_DETACH:
break;
}

return TRUE;
}

上面的程式碼即是屬於DLL的部份,當然我們要Build DLL出來就是為了要使用他,所以我們再實作一個測試這個DLL的程式

test.c:
#include < stdio.h >
#include < stdlib.h >
#include "windows.h"

int main()
{
HMODULE hInst;
void (*CallDll)(void);

hInst = LoadLibrary("testDLL.dll");

(FARPROC*)( CallDll)=GetProcAddress(hInst,"HelloWorld");

CallDll();
FreeLibrary(hInst);

return 0;
}


test.c主要就是先去將我們Build出來的DLL Load到Memory裡,再使用函數指標(CallDLL)去指向我們想要呼叫的函數(利用GetProcAddress),這樣就可以達到函數呼叫的功能,並且可以達到函式庫的動態載入

從以上的例子可以知道,如果想要新增一個函數在DLL裡的話,只需要在想要新增的函數前面加上一個DLLIMPORT的宣告即可。以一個整數相加的函數為例子:


DLLIMPORT int add(int x, int y)
{
return x+y;
}


HelloWorld的例子是一個沒有參數傳遞的例子,但是如果我們寫的函數是有參數的怎麼辦呢?我們只需要在函數指標(此例為CallDll)上做修改即可。以上面整數相加函數(add)為例子


#include
#include

//windows head file
#include "windows.h"

int main()
{
int result;
HMODULE hInst;
int (*CallDll)(int, int);

hInst = LoadLibrary("testDLL.dll");

(FARPROC*)(CallDll)=GetProcAddress(hInst,"add");

result = CallDll(2, 3);
printf("%d", result);
FreeLibrary(hInst);

return 0;
}


在宣告函數指標(CallDll)的地方,我們將它修改為回傳int並有兩個int參數,在GetProcAddress的地方我們指定函數名稱add,接著就像一般我們呼叫函數一樣。這樣就達到我們的目標了

Reference:
DEV-CPP中生成和使用DLL的方法

Tuesday, February 10, 2009

電子零件相關介紹 - 電阻

根據構造,電阻可分為以下幾類:

定值電阻:以帶電阻物質或線圈構成、且不會因任何環境或人為因素而變量的電阻。現時常見的定值電阻有顏色條紋用以識別電阻值、誤差等資料。定值電阻兩端多帶有連接線,以方便裝嵌;部份在集成電路中的定值電阻屬鑲嵌形式。
可變電阻:泛指所有可以手動改變電阻值的電阻器。根據使用的場合,可變電阻有電壓分配器、變阻器等別稱。常見的可變電阻有三個連接端。不同的連接配置可使該種電阻以可變電阻、分壓計,或定值電阻的方式運作。
光敏電阻:跟隨光線的強弱而改變電阻值。
熱敏電阻:跟隨溫度的高低而改變電阻值。
壓敏陶瓷:一種跟隨電壓的高低而改變電阻值的配件。
一種以半導體製成的電阻器擁有負數的溫度係數,能紓緩電子線路中的溫度影響。
除超導體以外的所有導電體均帶有一定電阻。


電阻色環標示法:


Reference:
Wiki 電阻器

電子零件相關介紹 - 電容

電容器的代表字母是C﹝capacitor﹞,單位為法拉﹝farad﹞,但是因為法拉的額度太大並不符合電容實際使用容量大小的標示需要,所以又有較小的微法拉μF﹝micro farad﹞相當於10^-6法拉,以及更小的微微法拉pF﹝pico farad﹞相當於10^-12法拉,以及介於兩者之間的nF﹝nano farad﹞,相當於10^-9法拉。

電容的標示主要有下列幾項,先簡單的來介紹一下:

1. 電容容量:標示著這一個電容的容量大小
2. 電容耐壓:表示此一電容所能承受的最高峰值電壓
3. 電容極性:除了無極性金屬膜電容與陶瓷電容,雲母電容外,一般電容都有極性的分別
4. 容量誤差:容量誤差代表此一型號電容的容量誤差值,誤差值越低代表您買到的電容容量與標示值越相近
5. 電容耐溫:表示電容能承受的工作溫度極限,超過此一限制,電解液可能乾涸或減短壽命。

標示方法

1‧電容容量

(1)以uF為單位:電容容量1uF以上者,直接以數值標示容量,例如10000uF,3300uF。
(2)以pF為單位:第一位數與第二位數代表電容數值,第三個數字代表10的次方,亦即數值後面0的個數。例如電容容量標示為104者,代表10後面有四個0,亦即100000pF。
(3)以nF為單位:電容容量標示為100n代表100x10-9=10-7法拉,亦等於0.1x10-6法拉,所以等於0.1uF。

以上關係可以表示為1uF=102nF=105pF

2‧電容耐壓

電容耐壓以伏特v表示,直接標示在電容外殼或印在套膜上,選用電容時應注意電路電壓峰值並預留餘裕。

3‧電容極性

電容極性一般印刷在電容外殼或套膜上,或以較短的接腳代表負極。

4‧電容誤差:

電容誤差以字母標示如下  
≦10pF
≧10pF




Reference:
零件認識與辨識-電容

Saturday, February 7, 2009

Touch Screen & Future

我們所常說的觸控螢幕其實是包含了兩個部份─Touch Panel、Touch Screen Controller(以下簡稱TSC),Touch Panel就是我們所看到的觸控螢幕,觸控螢幕較細節的原理則是當我們手去觸摸到Touch Panel上時 TSC會偵測並送出中斷訊號(PENIRQ)給MCU,而MCU在接到中斷訊號時 可以知道觸控螢幕被Touch到 但並不知道是在螢幕上的那一個點被觸碰到的,所以接著MCU必須要對TSC送出Command 去抓出X Y的座標值

Linux底下Touch Screen的Device名稱為ts,所以我們可以在/dev底下找到一個ts的device,而/dev/ts又為一個區塊設備 並非像RS232(/dev/ttySX)等是字元設備,所以在處理/dev/ts時需要先了解區塊內有包含了那些訊息

typedef struct {
unsigned short pressure;
unsigned short x;
unsigned short y;
unsigned short pad;
} TS_EVENT;


而/dev/ts包含的訊息就如上述所示,包含x,y等等的訊息。所以我們了解了這些之後 就可以寫程式來測試一下Touch Screen讀出來的訊息囉!程式碼如下:

#include < stdio.h >

typedef struct {
unsigned short pressure;
unsigned short x;
unsigned short y;
unsigned short pad;
} TS_EVENT;

static TS_EVENT ts_event;
static int ts;

int main()
{
ts = open ("/dev/ts", 0);
if (ts < 0) {
fprintf (stderr, "/dev/ts: Can not open touch screen!\n");
return 0;
}

while(1)
{
if(read(ts,&ts_event,sizeof(TS_EVENT)))
{
printf("X=%d,Y=%d,Pressure=%d \n",ts_event.x,ts_event.y,ts_event.pressure);
}

}

return 0;
}


一般我們見到的觸控面板大多都是電阻式的觸控面板,因為成本便宜,技術也算成熟。而像是iPhone的多重觸控方面其實原理就有點不一樣了,它是使用電容式的觸控面板,成本也較電阻式面板高。而像是iPhone的多點觸控操作對程式來說也是去抓取點的位置,你可以透過手的縮小、放大去計算兩指之間的距離,達到縮小放大的功能

關鍵報告式的未來空間操作系統Oblong G-Speak

g-speak overview 1828121108 from john underkoffler on Vimeo.

又一個未來科幻操作的影片,是有關於建築的系統的未來短片,此未來短片由Bruce Branit所拍攝並做後製,故事蠻感人的,有興趣的朋友可以去看看。Bruce Branit也有自己的工作室Branit VFX

World Builder from Bruce Branit on Vimeo.

不知道這些操作系統何時才會真正的普及於我們一般的生活當中..

Reference:
Touch Panel校正Screen
TouchLight: An Imaging Touch Screen and Display for Gesture-Based Interaction
觸摸屏技術發展介紹
Oblong G-Speak
Branit VFX
World Builder

Wednesday, January 7, 2009

利用PHP製作圖表

今天在Google如何利用PHP製作圖表時 找到一個很不錯的東西 -- Chart
Chart是一個PHP Library,可以讓我們很簡單的透過它繪製出圖表,而且安裝設定很簡單,使用起來也很簡單。Chart同時也是一個Open Source的Library

附註:我是以Windows的環境測試這個程式,Chart本身設定應該就是for Linux,所以我想Linux底下跑應該是沒有什麼問題。以下則是以Windows環境搭配Apache Server來做示範

首先我們先將Chart Library先Download下來:
http://quimby.gnus.org/circus/chart/chart-0.8.tar.gz


然後解壓縮之後將chart.php、rgb.php、IsoLatin1.enc三個檔案放到Appserv的網頁目錄底下,以我的電腦為例的話是C:\apache\htdocs。因為這個程式需要使用到GD函式庫,所以我們必須要將PHP設定可支援GD函式庫,所以我們到C:\WINDOWS底下找到一個php.ini的檔案,並且找到一行是:

extension=php_gd2.dll

在這一行的最前面我們會看到有一個分號(;),把分號去掉,重新啟動Apache。如果沒有分號,則表示已經啟動GD函式庫

接下來就要設定chart.php裡的一些config,找到下面幾行,並更改設定為下面的樣子

//設為剛剛我們複製到的目錄底下
$chart_cache_directory = "C:\apache\htdocs";
//設為剛剛我們複製到的路徑
$type1_font_encoding = "C:\apache\htdocs\Chart\IsoLatin1.enc";


接著就是寫測試程式的時候了!下面是測試程式 Code

example.php:

require('chart.php');
$state = array(
1,
1,
0,
1,
0
);
$time = array(
12,
13,
14,
15,
16
);
$chart = new chart(300, 200);
$chart->plot($state, $time, "red", "gradient", "black", 0);
$chart->stroke();
?>


就只有幾行的Code 就可以看到產生出來的圖表了!我們打開瀏覽器瀏覽我們剛剛寫的網頁,就可以看到如下面這個圖表了



Reference:
Chart Library

Tuesday, January 6, 2009

Google Toolbar 5 & IE Problem

今天開電腦裡的IE時,發現無法開啟IE,用工作管理員去看的時候發現,IE會開一下就關閉

後來用Google這個問題,發現似乎停用Google Toolbar就可以了!?試的結果真的是這樣。網址如下:
http://forums.microsoft.com/Technet-CHT/ShowPost.aspx?PostID=4274581&SiteID=23

因為之前使用Google Toolbar都沒有這個問題,我的環境
O.S. : Windows XP
Browser : IE 6
Google Toolbar : Google Toolbar 5

後來發現使用Google Toolbar 4的版本 就沒有這個問題了
載點

Monday, January 5, 2009

C# WinForm Socket

C# WinForm要使用Socket要注意的事還不少!因為若Socket要和WinForm是同時運行的,就必須使用到Thread,而使用到Thread就必須要小心結束WinForm的時候。Socket Thread是不是也一起結束了,如果沒有一起結束,就會留著一個孤兒程序在系統中,這樣會引起不必要的麻煩。若之後又要使用到Socket資源,很可能就會造成問題。所以在使用Socket Thread的時候,必須要小心

而我在建立Socket Thread的時候就先將Socket Thread設為Background執行,而將Thread設為Background跟Foreground有什麼不同呢?

根據MSDN所寫:
執行緒不是背景執行緒就是前景執行緒。背景執行緒和前景執行緒相同,唯一差別在於背景執行緒不會防止處理序終止。一旦終止屬於處理序的所有前景執行緒之後,Common Language Runtime 就會結束處理序。剩下的所有背景執行緒則會在尚未完成之前全部停止。


所以當我們結束WinForm的時候 Socket Thread也會跟著停止

Reference:
MSDN