'LabWindows/CVI'에 해당되는 글 8건

  1. 2008.04.24 CVI Control Modes for Generating Events
  2. 2008.04.21 CVI Serial통신 관련 함수
  3. 2008.04.16 CVI 시리얼 통신 예제
  4. 2008.04.11 CVI Ring control의 간단한 예
  5. 2008.02.01 CVI에서 Dynamic Link Library(DLL) 만들기
  6. 2008.02.01 CVI에서 Static Library 만들기
  7. 2008.01.24 GetActiveCtrl() 함수
  8. 2008.01.18 LabWindows/CVI에서 Win32 API를 사용하는 방법
2008. 4. 24. 21:42

CVI Control Modes for Generating Events



CVI로 이런 저런 프로그래밍을 하는 도중 늘 궁금한게 하나 있었다.
말이 그렇지 하나 뿐만이 아니고 아주 아주 많이있다..... -_-

그러던 도중 오늘 드디어 궁금증을 하나 풀어낸 것이 있으니..  바로 "컨트롤 모드(control mode)"에 관련된 것이다.
각 컨트롤마다 Edit 창을 열어 속성을 정하거나 하는데.. 중간에 보면 꼭 Control Mode라는 것이 있는 것이다. 내용도 'Hot', 'Normal', Indicator', 'Validate'등 다양하게 있는데 뭔뜻인지.. ^^;

CVI정보나눔의 질문답변란에서 그 정답을 찾았다.

> 안녕하세요...
> cvi를 시작한지 얼마 안 된 학생 입니다.
> hot와 validate의 차이점에 관해 좀 알려 주시면 감사 하겠습니다.
> 수고하세요...
>

CVI 도움말의 다음 항목에서 잘 설명해 주고 있습니다.
Control Modes for Generating Events

아래는 제가 공부삼아 번역해본 내용입니다.

---------------------------------------------------------
이벤트 발생에 대한 Control Mode

여러분은 control에 의해 발생되는 이벤트의 type을 match시키기 위해 control의 mode를 Normal, Indicator, Hot 혹은 Validate mode로 설정할 수 있습니다.

- Value Changed event는 GUI의 사용자가 control의 설정값을 수정할 때 발생되는 이벤트입니다. 즉, slide control의 slider를 마우스로 드래그 한다든지, string control에다 문자를 입력할 때 발생됩니다.

- Commit event는 GUI의 사용자가 동작을 실제로 완료할 때 발생됩니다. 즉, menu를 선택한다든지, 숫자를 입력하고 Enter키를 누른다든지, 혹은 slide control에서 slider를 드래그한 후에 마우스 버튼을 놓을 때 말입니다.

여러분이 control을 만들 때, 아래의 control mode 중에서 하나를 지정할 수 있습니다.
control mode는 control이 이벤트를 어떻게 발생시킬지, 사용자가 조작할 수 있는 범위를 어떻게 정할지를 결정합니다.

- Normal: 이 모드에서는 사용자가 control을 조작할 수 있게 하고, 또 control이 commit 이벤트를 제외한 모든 이벤트를 발생시킬 수 있습니다.

- Indicator: 이 모드에서는 사용자가 control을 조작할 수가 없고, 또 control이 commit나 value changed event를 발생시키지 않습니다.

- Hot: 보통 Default로 설정되어 있습니다. 이 모드는 Normal과 거의 같은데, 사용자가 어떤 동작을 수행했을 때, control이 commit 이벤트를 발생시킵니다. 통상적으로 hot control은 상태가 변경되었을 때 commit event를 발생합니다. 예를 들면, 사용자가 binary switch를 off에서 on으로 드래그하고, 마우스 버튼을 놓으면, commit event가 발생됩니다. 아래의 control type에 대한 설명은 commit event가 어떻게 발생되는지에 대해 확실한 규칙을 보여줍니다.

   o Hot numeric, string, 그리고 text box control은 값을 control에 입력한 후, Enter나 Tab을 눌렀을 때,
     또는 값을 입력한 후 마우스를 다른 곳 아무데나 클릭했을 때, commit event를 발생합니다.

   o Hot list box control은 check mode가 아닐 때, 사용자가 control이 active 되어 있는 동안 Enter를 누른
     다든지, list item을 더블클릭했을 때 commit event를 발생합니다.

   o Hot list box control은 check mode일 때, 사용자가 control이 active되어 있는 동안 스페이스바를 누른
     다거나, list item을 더블클릭했을 때 commit event를 발생합니다.

   o Hot graph control은 사용자가 화살표 키와 함께 커서를 이동할 때나, 사용자가 커서를 옮긴 후에 마우
     스 버튼을 놓으면, commit event를 발생시킵니다.

   o Hot table control은 사용자가 numeric 혹은 string cell에다 값을 입력한 후 active cell을 변경할 때,
     commit event를 발생시킵니다.

- Validate: 이 모드는 Hot 모드와 한가지 점만 빼고는 동일합니다.
commit event가 발생되기 전에 프로그램은 range-checking 속성이 Notify로 되어 있는 panel상의 모든 numeric control을 유효화(validate)시키게 됩니다. Notify 설정은 LabWindows/CVI가 미리 지정된 range를 벗어나는 control값을 체크하도록 합니다. 만약 range를 벗어나는 무효한 조건이 발견된다면, LabWindows/CVI는 control을 활성화시키고, Out of Range 라는 이름의 notification box를 표시합니다. 그리고, validate control은 사용자가 모든 control에 대해 유효한 새 값을 입력할 때까지는 commit event를 발생시키지 않습니다.
이런 과정은 GUI가 commit event를 발생시키기 전에 모든 numeric/scalar control의 값을 유효한지를 분명하게 해줍니다.
---------------------------------------------------------

쉽게 말해서,
Hot control은 숫자 컨트롤의 값이 range를 벗어나더라도 commit event가 발생되는 것이고,

Validate control은 숫자 컨트롤의 값이 range를 벗어나면,
유효한 새 값이 입력되기 전까지 commit event가 발생되지 않는 모드입니다. 즉, 숫자 컨트롤에 range를 설정한다면, Validate 모드로 하는 것이 더 적절하겠습니다.

그럼, 좋은 하루되세요.
2003-02-13 18:49:09
출처 : CVI 정보나눔(질문답변 게시판)

헐... 2003년 게시글이다... -_-
오래도 됐건만.. 난 이제서야 이런걸 찾고 하고 있다네.. ㅋㅋ

위의 내용은 'LabWindows/CVI Help'에서 'Control Modes for Generating Event(Library Reference > User Interface > Using a Graphical User > Control Modes for Generating Event)'라는 이름으로 찾을 수 있다.

'Programmings > CVI' 카테고리의 다른 글

CVI Serial통신 관련 함수  (0) 2008.04.21
CVI 시리얼 통신 예제  (0) 2008.04.16
CVI Ring control의 간단한 예  (0) 2008.04.11
CVI에서 Dynamic Link Library(DLL) 만들기  (0) 2008.02.01
CVI에서 Static Library 만들기  (0) 2008.02.01
2008. 4. 21. 17:25

CVI Serial통신 관련 함수



현재 LabWindows/CVI 를 이용해서 '시리얼(RS-232)통신'을 이용하는 프로그래밍을 하고 있는데.. 참 모르는 것이 많아 삽질 중이다. -_-

이런 저런 예제, FAQ등을 웹검색을 하고 또 'NI LabWindows/CVI Help'를 뒤지던 도중 RS-232 관련 좋은 문서가 있어 간단히 소개를 한다.

NI LabWindows/CVI Help를 일단 열고, 검색 탭을 클릭하여 검색을 활성화 하자.
검색창에 RS-232 Library tree로 검색을 하면 "RS-232 Library Function Tree"라는 녀석이 있는데... 이녀석이 CVI에서 RS-232 통신을 위해서 준비된 라이브러리 들인 듯 하다. -_-
뭐 정확한건 아니고.. 그냥 본인 생각에... ^^;

대충 아래와 같은 녀석들이 있다.

Function Tree, RS-232 Library

Class/Panel Name Function Name
Open/Close
Open COM and Configure OpenComConfig
Close COM CloseCom
Open COM-Current State OpenCom
Input/Output
Read Buffer ComRd
Read Terminated Buffer ComRdTerm
Read Byte ComRdByte
Read to File ComToFile
Write Buffer ComWrt
Write Byte ComWrtByte
Write from File ComFromFile
XModem
XModem Receive File XModemReceive
XModem Send File XModemSend
XModem Configure XModemConfig
Control
Set Timeout Limit SetComTime
Set XON/XOFF Mode SetXMode
Set CTS Mode SetCTSMode
Flush Input Queue FlushInQ
Flush Output Queue FlushOutQ
Send Break Signal ComBreak
Set Escape Code ComSetEscape
Status
Get COM Status GetComStat
Get COM Line Status GetComLineStatus
Get COM Connection State GetComConnectionState
Get Input Queue Length GetInQLen
Get Output Queue Length GetOutQLen
Return RS-232 Error ReturnRS232Err
Get Error String GetRS232ErrorString
Callbacks
Install COM Callback InstallComCallback
Extension
Get System COM Handle GetSystemComHandle

자세한 내용은 NI LabWindows/CVI Help를 검색하시길...


'Programmings > CVI' 카테고리의 다른 글

CVI Control Modes for Generating Events  (0) 2008.04.24
CVI 시리얼 통신 예제  (0) 2008.04.16
CVI Ring control의 간단한 예  (0) 2008.04.11
CVI에서 Dynamic Link Library(DLL) 만들기  (0) 2008.02.01
CVI에서 Static Library 만들기  (0) 2008.02.01
2008. 4. 16. 19:25

CVI 시리얼 통신 예제



간단한 '시리얼 통신프로그램''LabWindows/CVI'로 구현하는 방법에 대해 알아보려 한다.

LabWindows/CVI에서 제공하는 Sample RS232예제를 보고 하려니 쫌 답답한 면도 있고.. 약간 복잡(?)한것 같아 일단 접는다. ㅋ
'CVI 정보나눔'이라는 한글 CVI관련 사이트의 예제 프로그램을 간단히 분석해보려 한다.

RS-232통신이라고 하지만.. 간단한 예제라 그런지 생각보다 단순하다.

'CVI 정보나눔'에서는 다른 프로그램과 연동하여 그 프로그램의 정보를 받아오는 역할을 하지만, 본인은 간단히 루프백하여 전송한 데이터를 다시 받아오는 형식으로 진행한다. 그게 간단하니깐...
프로그램을 설명하자면, RS-232 Port에서 포트를 선택하고, Write 에서 전송할 데이터를 입력하고 Query버튼을 클릭하면, 전송한 데이터가 Read로 다시 리턴되는 프로그램이다.
사용자 삽입 이미지

대충의 'uir'을 위의 화면과 같이 작성한다. 보기 좋게 속성 값과 함수의 값도 설정하고...
다 대충 대충 해도 Query버튼에 관련된 세팅은 대충하면 안된다. RS-232 통신하는데 가장 중요한 부분이므로..

본인의 경우 Query버튼의 속성을 아래 그림과 같이 Callback Function을 cmdQuery라고 정해 주었다. 사실... CVI정보나눔에서 이리 되어 있어 따라한거긴 하지만... -_-
사용자 삽입 이미지

cmdQuery 콜백함수의 내용은 아래와 같다.
int CVICALLBACK cmdQuery (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
{
int port, RTCount;

// 쓰기 버퍼관련 변수들..
char WriteBuffer[256];
int length;
int TermChar; // 전송하기 전에 덧붙일 Term.Char방법
// 0:None, 1:CR(0x0D), 2:LF(0x0A), 3:CR+LF

// 읽기 버퍼관련 변수들..
char ReadBuffer[10000];

// 1. Port를 Open하고, Configure합니다.
GetCtrlVal (panel, PANEL_ringRESOURCE, &port);
if(!OpenComConfig (port, "", 9600, 0, 8, 2, 512, 512) ) {
SetComTime (port, 2000);

// 2. 장치 포트로 보낼 데이터를 읽어옵니다.
GetCtrlVal (panel, PANEL_strWriteBuffer, WriteBuffer);
GetCtrlVal (panel, PANEL_ringTermChar, &TermChar);

// 3. Termination character를 덧붙여서 송신합니다.
switch(TermChar) {
case 1:
strcat(WriteBuffer, "\015"); // CR(0x0D)는 8진수로 015
break;
case 2:
strcat(WriteBuffer, "\012"); // LF(0x0A)는 8진수로 012
break;
case 3:
strcat(WriteBuffer, "\015\012");
break;
}
length = strlen(WriteBuffer);
ComWrt (port, WriteBuffer, length);

// 4. 장치 포트로부터 데이터를 읽어옵니다.
ReadBuffer[0] = '\0';
RTCount = ComRdTerm (port, ReadBuffer, 50, 0x0A);
ReadBuffer[RTCount] = '\0';
SetCtrlVal(panel, PANEL_strReadBuffer, ReadBuffer);

// 5. 포트를 닫습니다.
CloseCom (port);
}
}
break;
}
return 0;
}

일반적인 통신 프로그래밍과 얼추 비슷한것 같다.
통신할 장치(Device)를 열고, 읽고, 쓰고, 통신한 장치를 닫고... 등..

LabWindows/CVI에서의 시리얼 통신에 관련된 부분은 NI의 웹페이지에서도 찾아볼 수 있다.
LabWindows/CVI Serial Communication Serial Communication Programming(http://www.ni.com/support/cvi/serlprog.htm)

위의 링크를 따라가면
  • Opening and Closing COM Ports
  • Writing to COM Port
  • Reading from COM Port
  • Using InstallComCallback with Serial Reads
등에 관련된 정보를 얻을 수 있다.

2008. 4. 11. 11:30

CVI Ring control의 간단한 예



CVI 프로그래밍을 하면 일반적인 GUI프로그래밍을 하는것과 거의 유사하다.
수많은 컨트롤들이 있고, 그에 따른 속성들과 함수들이 제공된다. 이를 모르면 그야말로 캐삽질!!!

작업량이 많아 간간히 CVI를 하는 실정이다. 뭐 이리저리 문서를 찾아는 보지만 적당히 볼만큼의 문서는 눈을 씻고 찾아볼래야 찾아볼 수가 없다. 그래도 어쩌겠는가... 일단 하기는 해야하는데.. -_-

하는 작업들은 거의 대부분이 CVI에서 제공하는 예제들과 NI LabWindows/CVI Help를 참고하고 있다.
뭐 다른 사람들도 다 마찬가지겠지만.. ^^;

"RING"라는 컨트롤이 있다.

사용자 삽입 이미지

CVI에서 말하는 "RING"이라는 녀석이다.

그 중에서 빨간 밑줄을 그은 녀석.. 일반적으로 다른 GUI에서 "콤보박스"라고 부르는 녀석에 대해서 알아보려한다.
CVI에서는 "Recessed Menu Ring"라고 부르는 듯하다. 뭐 그리 적혀있으니...
기능을 대충 보아하니 완전 콤보박스다. 괜히 이름만 다르게 불러 사람을 헷갈리게 하고 있다.

하는 일은 여러 메뉴(?)를 가지고 있으면서 공간이 모자라는 듯한 곳에 위치해 컨트롤을 한 번 클릭하게 되면 리스트가 펴지면서 원하는 메뉴를 선택할 수 있게 하는 것이다.
사용자 삽입 이미지

여기서 보일 예제는 RING에서 어떤 항목을 선택하게 되면 옆에 리스트박스(ListBox)라는 녀석에 해당하는 하위 리스트를 보여주는 것이다.
왠지 꽤 사용성이 짙어보이긴 하는데... -_-;

간단하게 위의 그림과 같이 UI를 작성하자.
그리고 RING의 속성을 대충 채워 넣는다.
*.uir파일에서 Ring 컨트롤을 더블클릭하면 아래와 같은 에디트 창이 뜬다
사용자 삽입 이미지

Ring에 들어갈 세부 항목을 선택하기 위해서 "Label/Value Pairs..."를 클릭한다.
사용자 삽입 이미지
사용하려 하는 항목과 값을 대충 넣는다.

이로서 일단 RING에대한 준비작업은 끝났다.
여기서 중요한 것은 Data Type이다. Value의 값이 Data Type의 값과 일치해야한다. 만일 Data Type를 char나 다른 값으로 바꾸어보며 작업을 해보면... 대충 감을 잡을 것이다.

List Box의 경우도 동일하게 작업을 해준다. List Box의 Label/Value Pairs..는 일단 Data Type만 정의해주고 나머지는 비워둔다. RING에서 선택된 값을 나중에 넣어줄 것이므로..

이제 만들어진 uir를 이용하여 소스 프레임을 생성한다.
메뉴에서 Code > Generate > All Code...

음.. 이제 소스부분으로 슬슬 넘어가 보겠다.

일단 List Box에 들어갈 데이터를 정의해야겠다.
List Box는 Label과 Value로 이루어져있다. 그래서 데이터도 Label과 Value의 쌍으로 된 녀석을 만들어준다.
typedef struct {
    char name[20];
    int id;
}datatype;

datatype fluit[4] = {{"사과", 0},
                           {"딸기", 2},
                           {"바나나", 3},
                           {"오렌쥐", 5}};

datatype vegetable[2] = {{"오이", 0},
                                    {"당근~당근!!", 1}};
간단하게 위와 같이 만들었다.
RING에서는 과일과 채소라는 항목을 만들었고, 과일이라는 항목을 선택했을 때 List Box에 fluit라는 녀석을 보여줄 것이다. 음.. 채소를 선택했다면... vegetable라는 녀석을 보여줄것이고..

다음은 RING 컨트롤을 생성할 때 같이 생성한 cmdRING라는 함수의 내용을 채워넣어야 한다.
cmdRING는 위쪽에 RING의 속성을 채워넣는 부분에서 CallBack Function이라는 항목에 넣었던 부분이다.
CallBack Function이라는 부분에 cmdRING라는 녀석을 넣어주면 자동으로 아래와 같은 부분이 생성된다.
int CVICALLBACK cmdRing (int panel, int control, int event,
        void *callbackData, int eventData1, int eventData2)
{
     switch (event)
    {
        case EVENT_COMMIT:
             break;
    }
    return 0;
}
이 내부에 원하는 부분을 채워 넣기만 하면 된다.

본인의 경우 아래와 같이 채워 넣었다.
사용자 삽입 이미지
흠.. 흠.. 타이핑하기 귀찮아서... -_-

RING에서 선택된 항목은 Value값에 의해서 switch-case의 해당하는 부분으로 점프한다.
과일을 선택하면 case 0:에 걸리고, 채소를 선택하면 case 1:에걸리고.. 이건... C에 나오는 부분이니 대충 패스!!
각 선택되었을 때 미리 생성해 놓은 데이터의 크기(리스트의 개수)만큼 루프를 돌면서 List Box에 추가시켜주는 간단한 예이다.

List Box에 새로운 아이템을 추가할 때에는 InsertListItem()이라는 함수를 사용하게 된다.

InsertListItem

int InsertListItem (int panelHandle, int controlID, int itemIndex, char itemLabel[], ...);

Purpose

Inserts a label/value pair into a list or ring control at a specific zero-based index.

Inserting the new pair causes the indices of existing label/value pairs at and beyond the insertion point to increase by one.

You can create columns in a list box control by embedding escape codes in the itemLabel parameter.

......

더 자세한 사항은 NI LabWindows/CVI Help를 참조하면 될 듯 하다.





2008. 2. 1. 17:23

CVI에서 Dynamic Link Library(DLL) 만들기



이번엔 LabWindows/CVI에서 Dynamic Link Labrary(DLL)을 만드는 방법이다!!
아무래도 Static Library보다는 Dynamic Link Labrary이 사용하기에도 더 편리하고 더 많이 사용하는 듯 하기에...

현재 만드는 DLL이니 LIB니 하는 것들은 다음번에 다룰 CVI로 작성하게 될 MP3 Player를 만들기 위해 사용되는 라이브러리이다. 뭐 직접 하지 않아도 상관은 없지만.. 하나하나 직접 따라 해보는 것이 좋지 않을까? 생각한다.

이번 예제도 앞서 이야기 했던 'Static Labrary'와 마찬가지로 'CVI 정보나눔'의 강좌를 토대로 작성을 했고, KD_MCI_sl_source.zip파일을 이용하여 DLL파일을 작성하게 된다.

DLL을 만들기 위해 하나의 프로젝트(KD_MCI.prj)를 생성한다. 물론 다른 이름으로 프로젝트를 생성해도 전혀 상관이 없다. 위의 첨부파일의 압축을 해제하고, 파일들을 프로젝트에 포함시킨다.
참고로, 편의를 위해서 파일명을 KD_MCI_sl.*에서 KD_MCI.*로 바꾸어 준다. 안해도 상관은 없음... -_-
사용자 삽입 이미지
Static Library를 만들 때와 다른 점이라면, 프로젝트에 winmm.lib가 포함된다는 점이다.

다음 해주어야 하는 일은 각각의 소스파일에 약간의 수정을 해주어야 하는 부분이 있다.
파일 이름을 수정해 주었으므로 include문도 수정을 해주고, Export할 변수 이름과 함수 앞에 DLLEXPORT라는 것을 추가시켜준다.
Export한다는 것은 해당 DLL을 이용하는 다른 프로그램이 해당 변수나 함수를 이용할 수 있도록 하겠다는 의미이다.
사용자 삽입 이미지
참고로... 위 그림에 나오는 부분만 바꾸는 것이 아니고 죄다~ 싹 다 바꾸는 거다!!

다음은... DLL중 가장 중요한 함수를 작성해야 한다.
DLL main이라고.. 다른 main함수와 마찬가지로 DLL의 시작점을 나타내는 함수이다.
'KD_MCIPLAY DLLEXPORT kmp; 다음에 커서를 위치시키고, Edit > Insert Construct > DLLMain을 선택하자.
사용자 삽입 이미지

그러면, 아래와 같이 DLLMain과 관련된 부분이 생성되는 것을 확인할 수 있다.
사용자 삽입 이미지
추가로 맨위의 #define KD_MCI_C는 KD_MCI.h 파일에서 전역변수 kmp에 대한 선언을 DLL만들 때와 DLL사용할 때를 구분하기 위해 정의한 매크로이다.

다음으로 KD_MCI.h파일을 수정하자.
별건 없고, 아래의 붉은 부분으로 된 부분을 수정해 주면 된다.
사용자 삽입 이미지
잘은 모르지만.. extern KD_MCIPLAY DLLIMPORT kmp;를 해주어야 한다고 한다. DLL을 만들 때는 선언되지 않도록 하고, 나중에 DLL을 사용하기 위한 프로그램의 프로젝트에서는 적용되어 사용을 할 수 있게 된다고 한다.
.c에서 define으로 정의해 두고, 정의가 되지 않으면 사용하도록 해서 그런가?? -_-
다음은 DLL Project 파일 속성을 설정하는 부분이다.
Build > Configuration > Release를 선택하고,
사용자 삽입 이미지

Build > Target Type > Dynamic Link Library를 선택,
사용자 삽입 이미지

Build > Target Settings... 에서 DLL Export Option을 설정한다.
사용자 삽입 이미지

Build > Create Release Dynamic Link Library 메뉴를 선택하여, DLL을 생성한다.
생성된 DLL은 프로젝트가 있는 디렉토리를 확인하면 생성된 파일을 볼 수 있을 것이다.
사용자 삽입 이미지

생성된 파일들은 Static Library와 비슷하다.

참고 : CVI 정보나눔

'Programmings > CVI' 카테고리의 다른 글

CVI 시리얼 통신 예제  (0) 2008.04.16
CVI Ring control의 간단한 예  (0) 2008.04.11
CVI에서 Static Library 만들기  (0) 2008.02.01
CVI에서 컨트롤을 동적으로 생성하기  (0) 2008.01.24
GetActiveCtrl() 함수  (0) 2008.01.24
2008. 2. 1. 14:13

CVI에서 Static Library 만들기



LabWindows/CVI에서 Static Library를 생성하는 방법에 대해서 알아보고자 한다.

이 글은 'CVI 정보나눔'이라는 홈페이지의 강좌를 보고 직접 실습을 해가며 작성하는 것으로.. 이 문서를 보는 사람들도 각자 따라해보기 식으로 하면 도움이 될 듯 하다.

먼저 이 예제에서 필요로해서 제공되는 소스코드가 들어있는 파일이 있다.
일단 위의 파일을 다운로드받고, 압축해제를 한다.

프로젝트를 하나 생성하고, 다운받은 파일 중 .c, .h파일을 프로젝트에 추가시킨다.
예제와 같이 프로젝트 이름은 'KD_MCI_sl.prj'라는 이름으로 만든다.
사용자 삽입 이미지

다음은 project 파일속성을 설정하는 단계이다.
예제에서는 Build > Configuration > Release 모드로 작성을 했다.
처음 테스트 하는 단계에서는 Debug모드로 작성을 하고 테스트 한 후, 검증된 단계에서 Library로 만들 때에는 Release모드로 작성을 하는게 맞는 듯 하다.
사용자 삽입 이미지

Build > Target Type을 Static Library로 변경한다.
사용자 삽입 이미지

Build > Target Settings... 메뉴를 선택하고 Target Settings창에서 "Library Generation Choises..."버튼을 클릭한다.
어떤 컴파일러용의 라이브러리를 생성할 것인가를 선택하는 것인데, 'Generate static libraries for both compilers'를 선택하게 되면 'Visual C++''Borland C++'계열의 라이브러리도 함께 생성된다.
사용자 삽입 이미지
사용자 삽입 이미지

마지막 단계로 Build > Create Static Library메뉴를 클릭하자!!!
사용자 삽입 이미지

다음과 같은 메시지 창이 나타나게 되면 정상적으로 'Static Library'를 생성한 것이다.
사용자 삽입 이미지

프로젝트를 생성한 디렉토리에 들어가서 Static Library가 정상적으로 생성 되었는지 확인해 보자
사용자 삽입 이미지
위의 그림에서 보는것처럼 KD_MCI_sl.lib라는 라이브러리 파일이 있고, borland, msvc라는 디렉토리가 있는것을 확인할 수 있다.
KD_MCI_sl.lib는 CVI용 Static Library이고, borland, msvc는 각각 Borland용, MS Visual C++용 Static Library이다.

차후에 이렇게 만들어진 라이브러리 유용하게 사용할 수 있을 것 같다.

출처 : CVI 정보나눔

'Programmings > CVI' 카테고리의 다른 글

CVI Ring control의 간단한 예  (0) 2008.04.11
CVI에서 Dynamic Link Library(DLL) 만들기  (0) 2008.02.01
CVI에서 컨트롤을 동적으로 생성하기  (0) 2008.01.24
GetActiveCtrl() 함수  (0) 2008.01.24
GetCtrlVal() 함수  (0) 2008.01.24
2008. 1. 24. 18:33

GetActiveCtrl() 함수



GetActiveCtrl()함수는 특정 Panel위에 있는 활성화된 컨트롤의 ID를 받아오는 함수이다.

음.. 대충 사용하려는 컨트롤의 ID를 알고싶을 때 사용하면 좋을듯..

예를 들어(CVI 정보사랑을 검색하다 발견..)..
버튼이라든지 다른 컨트롤을 동적으로  생성할 경우가 있을 수 있다.
이렇게 동적으로 생성한 컨트롤을 다룰 때 이녀석의 ID는 어떻게 될지.. 혹은 ID를 사용해야 할 경우가 있다면, 그때 GetActiveCtrl()을 사용할 수 있을 것이다.

반대로 SetActiveCtrl()은 특정 Panel의 활성화 된 컨트롤에 ID를 세팅하는 정도(?)의 함수일 것이다.

GetActiveCtrl

int GetActiveCtrl (int panelHandle);

Purpose

Obtains the ID of the active control on the specified panel.
The active control is the control that receives keyboard events when the panel is the active panel.

Parameters

Input
Name Type Description
panelHandle integer Specifier for a particular panel that is currently in memory. You obtain this handle from LoadPanel, NewPanel, or DuplicatePanel.

Return Value

Name Type Description
controlID integer Returns the control ID of the active control. If the panel has no controls, GetActiveCtrl returns zero.

GetActiveCtrl can return the following error code:

4—Panel, pop-up, menu bar, or plot ID is invalid.

참고 : CVI 정보나눔, NI LabWindows/CVI Help

2008. 1. 18. 18:04

LabWindows/CVI에서 Win32 API를 사용하는 방법



Win32 API에는 Windows라는 OS에 사용되는 여러 자원을 이용하기 때문에 Windows상에서는 CVI보다는 훨씬 유용하게 사용할 수 있다.

그러나... LabWindows/CVI에서 Win32 API를 사용할 수 있다고 한다.

이 문서는 LabWindows/CVI상에서 Win32 API를 사용하는 방법에 대해 간략하게 말하고자 한다. 다음은 LabWindows/CVI 8.5에서 작업을 한 것이다.

방법은 생각외로 간단(?)하다.
Build Options를 수정해주는 것과 약간의 작업으로 끝!

첫 번째로 CVI에서 Options의 Build Options...를 선택한다.
사용자 삽입 이미지

다음은 Compiler Defines부분을 수정해준다.
사용자 삽입 이미지
원래는 /DWIN32_LEAN_AND_MEAN로 되어있는데.. 이부분을 /WIN32_LEAN_AND_MEAN로 수정한다음 OK버튼을 클릭한다.

Win32 API 함수를 사용하기를 원하는 소스파일에 windows.h 헤더파일을 추가한다.
그리고나서 해당 API함수에 대한 Import Library를 Project에 추가한다. Import Library를 확인하는 방법은 CVI의 Help를 이용하면 된다.
사용자 삽입 이미지

메뉴의 Help를 보면, Windows SDK에 대한 정보를 얻을 수 있는 것이 있다.
사용자 삽입 이미지
찾을 키워드에서 찾고 싶은 함수를 입력하게되면, Import Library를 확인할 수 있다.

해당하는 Import Library를 CVI가 설치된 디렉토리에서 찾아 해당 Project에 추가한다. 그리고 나서 소스에 원하는 Win32 API함수를 사용한 후 컴파일 하고, 실행파일을 만들면 CVI에서 Win32 API를 사용하는 것을 볼 수 있을 것이다.

참고 : CVI 정보나눔


'Programmings > CVI' 카테고리의 다른 글

CVI에서 컨트롤을 동적으로 생성하기  (0) 2008.01.24
GetActiveCtrl() 함수  (0) 2008.01.24
GetCtrlVal() 함수  (0) 2008.01.24
CVI 첫번 째 프로그램 - Hello world  (0) 2008.01.15
CVI 설치  (0) 2008.01.15