Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 파이썬
- Replication
- Windows
- golang
- docker
- BATCH
- 영상스트리밍
- psutil
- python3.9
- go
- QT_QPA_PLATFORM_PLUGIN_PATH
- 가상화 중첩화
- pip
- 자식프로세스
- 자원측정
- go.mod
- repo
- Python
- Thread
- 레파지토리
- asyncio
- APT
- 스트리밍
- apt-get
- dockercontainer
- FastAPI
- Hyper-V
- 주식
- mariadb
- Finance
Archives
- Today
- Total
검색하기귀찮아서만든블로그
[python] DLL 동적 라이브러리 함수 사용하기 본문
windows에서 사용하는 DLL 라이브러리를 로드하여 내부의 함수를 동적 로딩하여 사용하는 코드를 작성해 보았다.
Python에서도 ctypes 패키지를 사용하여 windows 변수를 그대로 사용할 수 있다는 부분이 독특했다.
아래 코드는 windows kernel32.dll을 로드하여 process id와 session id를 구하는 간단한 예제이다.
동적 라이브러리에서 함수 포인터 얻고, 파라미터 유형을 지정한다. 유의할 점은 dll 내부의 함수 원형을 알고 있어야 사용할 수 있다. (kernel32.dll을 msdn 레퍼런스를 참조)
함수 파라미터로 포인터 (out) 형태를 요구하는 case에 대한 내용도 포함되어 있다.
다음에는 구조체 포인터를 넘기는 방법도 공부해야겠다.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# c 변수 타입 패키지
from ctypes import *
# windows 전용 변수 타입 패키지
from ctypes.wintypes import *
# windows 의 kernel32.dll 동적 라이브러리를 로드한다.
kernel32dll = windll.LoadLibrary("kernel32.dll")
# 동적 라이브러리 객체에서 함수 포인터를 얻는다. (현재 프로세스 ID 수집 함수)
pfGetCurrentProcessId = getattr(kernel32dll, 'GetCurrentProcessId')
# 함수를 호출한다.
MyProcessId = pfGetCurrentProcessId()
# 출력한다.
print('My Process ID : {0}'.format(MyProcessId))
############################################################################
# 동적 라이브러리 객체에서 함수 포인터를 얻는다. (현재 프로세스 ID 로 Windows Session ID 수집 함수)
pfProcessIdToSessionId = getattr(kernel32dll, 'ProcessIdToSessionId')
# 함수 포인터에 아규먼트 타입을 지정한다.
# 함수 원형 참조: https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-processidtosessionid
pfProcessIdToSessionId.argtypes = [DWORD, PDWORD]
# windows 세션 아이디 값을 받을 변수를 정의한다.
MySessionId = DWORD()
# 함수를 호출한다. (두 번째 인자는 포인터이므로 byref method 로 처리)
pfProcessIdToSessionId(MyProcessId, byref(MySessionId))
# windows 세션 ID를 출력한다.
print('My Session Id : {0}'.format(MySessionId.value))
'개발' 카테고리의 다른 글
[Python] FinanceData 활용기 (1) (0) | 2022.09.28 |
---|---|
[python] coroutine 비동기 처리 (0) | 2022.06.06 |
[python] 구조체 (struct) 사용하기 (0) | 2022.05.18 |
[Python] 프로세스 시스템 자원 측정 (0) | 2022.04.16 |
[python] multiprocessing 사용법 (0) | 2022.04.02 |