티스토리 뷰

LabVIEW에서 DLL을 읽어오자 - 2, 

WINAPI 사용하기 (user32.dll 응용)



이 글에서는 LabVIEW에서 user32.dll을 이용하여 WINAPI를 사용하는 방법에 대해서 알아보도록 하겠습니다. LabVIEW에서도 다른 회사에서 만든 dll을 이용할 수가 있는데요. 이를 위해서는 Call Lib Function Node에 대한 사용법을 아셔야 합니다. 이 vi에 대한 사용법은 아래를 참조하세요.



위의 링크를 따라가시면, LabVIEW에서 dll을 import하는 방법을 이해할수 있습니다. 그럼 오늘은 윈도우에서 기본으로 제공하는 user32.dll을 LabVIEW에서 어떻게 사용하는지에 대해서 살펴보도록 하겠습니다.


user32.dll은 사용자 인터페이스를 처리하기 위한 라이브러리입니다. 윈도우, 다이얼로그 박스, 메뉴, 커서, 아이콘 등등에 대한 이슈를 이 dll을 통해서 처리할 수 있습니다.


오늘 예제에서는 dll 파일안에 있는 GetcursorPos 함수를 사용하는 방법에 대해서 설명드릴겁니다. 이 함수에 대한 정보를 MSDN에 어떻게 정의되어 있는 살펴보겠습니다. 


GetCursorPos 함수는 현재 마우스의 커서 위치가 어디에 있는지를 x, y 포지션 값으로 알려주는 함수입니다.



이 함수는 LPPOINT라는 구조체를 입력받고 있으며, 제대로 함수가 수행되었는지에 대한 값을 Boolean 형식으로 리턴받고 있네요.


1) LPPOINT 구조체가 어떻게 구성되어 있는지 살펴봐야겠지요.


이 구조체는 단순히 x, y 포인트를 long형타입으로 값을 가지는 단순 구조체입니다. LabVIEW에서 Long 타입을 처리하기 위해서는 어떤 타입을 사용해야 하는가? 지난 포스트에도 남겨놓았지만 아래의 표를 참고하시면 됩니다. LabVIEW에서는 long 타입을 32비트 부호정수로 처리를 하고 있네요.



그럼 LabVIEW에서는 구조체를 어떻게 처리를 해야하는가? 에 대한 답을 알아야 겠지요. LabVIEW에서 구조체를 처리하기 위해서는 LabVIEW의 클러스터 개념을 이해하시면 됩니다.


구조체 = 클러스터


POINT 구조체가 x, y 값을 가지는 구조체 이므로 LabVIEW에서도 int32 타입의 두개의 값을 가지는 클러스터를 생성하시면 됩니다 구성은 아래의 그림 처럼 되겠네요 



자 이제 구조체를 다 만들었습니다. 그럼 이제 함수에 사용하기 위해 적용하는 부분을 살펴보도록 합시다.


2) 블록다이어그램에 Call Lib Function Node를 추가합니다

이 노드를 추가하는 방법은 아래와 같습니다.



그리고 나서 이 노드를 더블클릭합니다. 



라이브러리 경로에 user32.dll을, 함수이름에 GetCursorPos를 선택합니다. 

또한 옆의 호출형식을 WINAPI로 설정을 합니다. 호출형식은 lib가 어떻게 구성이 되어 있느냐에 따라서 결정이 됩니다. user32.dll은 아래의 표와 같이 __stdcall 호출 형식으로 함수가 구현이 되어 있습니다.


즉 사용하고자는 dll의 파일이 어떻게 만들어 졌는지를 파악을 하셔야 오류없이 사용하실 수 있습니다. 


호출 형식—함수의 호출 형식을 지정합니다. 기본은 C입니다.

  • 표준 호출(WINAPI)—객체가 __stdcall 호출 형식을 사용하는지 여부를 컨트롤합니다. 
  • C—객체가 __cdecl 호출 형식을 사용하는지 여부를 컨트롤합니다.


그리고 나서 파라미터 탭으로 이동합니다. 파라미터 탭에서는 함수의 파라미터와 리턴값을 설정할 수가 있습니다.



먼저 리턴값인 반환 타입부터 살펴보도록 하겠습니다. LabVIEW의 Call Lib Function Node에서는 bool 타입을 지원하지 않습니다. 따라서 bool 타입의 값을 처리할 수 있는 숫자형으로 지정을 하시면 32비트 부호 정수로 설정을 합니다.



그럼 이제 위에 만든 클러스터(구조체)에 대한 인자 타입을 생성해야 합니다. +버튼을 누르셔서 인자 하나를 생성한 다음 타입은 '타입에 적용', 데이터 포맷에는 '값에 의한 핸들'을 지정합니다. 


구조체를 사용하려면 무조건 타입에 적용을 이용하셔야합니다. 또한 구조체의 포인터가 전달되기 때문에 값에 의한 핸들로 지정을 하시면 됩니다. (다른 타입을 사용할 때 살펴봐야 하는 타입의 적용에 대한 관련 내용 아래에 첨부합니다. 아쉽게도, 영어입니다 ㅠㅠ)


Adapt to Type


Use Adapt to Type to pass arbitrary LabVIEW data types to DLLs in the following ways:

Scalars are passed by reference. A pointer to the scalar is passed to the library.

Arrays and strings are passed according to the Data Format setting. You can choose from the following Data Format settings: 


Handles by Value passes the handle to the library. The handle is not NULL.

Pointers to Handles passes a pointer to the handle to the library. If the handle is NULL, treat the handle as an empty string or array. To set a value when the handle is NULL, you must allocate a new handle.

Array Data Pointer passes a pointer to the first element of the array, allowing the called library to access the array data as the data type of the array data.

Interface to Data allows you to inspect LabVIEW data and data type information in C++ code. For more information about this setting, refer to the ILVDataInterface.idl and ILVTypeInterface.idl files in the labview\cintools directory.


Clusters are passed by reference.

Scalar elements in arrays or clusters are in line. For example, a cluster containing a numeric is passed as a pointer to a structure containing a numeric.

Clusters within arrays are in line.

Strings and arrays within clusters are referenced by a handle. 


자 이제 다 왔습니다. 함수설정을 다 했고, 생성한 클러스터를 인자의 첫번째 값에 넣고, 이에 대한 인디케이터를 Call Function Library에서 나오는 값을 연결해 줍니다. 간략히 와일문안에 마우스가 움직일때 마다 값을 변경하는 코드를 구현해 보았습니다. 



이제 실행화면을 보실 까요! 



마우스의 위치에 따라 Return Value의 값이 변경되는것 확인 할 수 있습니다. 


이글이 도움이 되셨나요.

그렇다면 아래의 그림을 클릭해주세요.


댓글