본문 바로가기
프로그래밍

👨‍💻 [Flutter] Flutter 에서 윈도우의 32비트 DLL을 로드해서 사용하는 방법은 어떻게 되나요?

by 밝음의기둥 2025. 1. 13.
반응형

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


👨‍💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.

Flutter 에서 윈도우의 32비트 DLL을 로드해서 사용하는 방법은 어떻게 되는지 간략히 알아보았습니다.


질문 >

Flutter 에서 윈도우의 32비트 DLL을 로드해서 사용하는 방법은 어떻게 되나요?

답변 >

Flutter의 Windows 앱은 기본적으로 64비트로 빌드되기 때문에 32비트 DLL을 로드하려면 추가적인 설정과 작업이 필요합니다. 아래는 32비트 DLL을 Flutter에서 사용하는 방법에 대한 상세한 안내입니다.


1. 32비트와 64비트의 차이

Flutter는 기본적으로 64비트 바이너리를 생성하며, 이는 64비트 DLL과 호환됩니다. 하지만 32비트 DLL은 64비트 환경에서 직접 로드할 수 없습니다.

이를 해결하려면:

  1. Flutter 앱을 32비트로 빌드하거나,
  2. 중간 브리지(external process)를 사용해 DLL과 통신합니다.

2. 해결 방법 1: Flutter 앱을 32비트로 빌드

1) Visual Studio에서 32비트 빌드를 활성화

Flutter의 Windows 앱은 Visual Studio 빌드 환경을 사용합니다.

단계:

  • Visual Studio에서 32비트 플랫폼 추가:
    • Flutter 프로젝트의 windows/runner.sln 파일을 열기.
    • Solution Explorer에서 Configuration Manager 열기.
    • Active solution platform에서 x86(32비트)을 추가.
  • CMake 파일 수정:
    • Flutter는 기본적으로 64비트 바이너리를 타겟으로 합니다. windows/CMakeLists.txt 파일에서 CMAKE_GENERATOR_PLATFORM을 32비트로 설정합니다:
set(CMAKE_GENERATOR_PLATFORM Win32)

  • 32비트 Flutter 엔진 활성화:
    • Flutter에서 32비트 빌드를 활성화하려면 다음 명령을 실행합니다:
flutter build windows --target-platform=windows-x86


3. 해결 방법 2: 중간 브리지 사용

Flutter 앱은 64비트로 유지하고, 중간 프로세스를 통해 32비트 DLL과 통신합니다. 이 방법은 기존 Flutter 앱의 아키텍처를 변경하지 않고 DLL과 상호작용할 수 있습니다.

1) 중간 브리지의 역할

  • Flutter 앱(64비트)은 중간 브리지 프로세스(32비트)와 통신합니다.
  • 브리지 프로세스는 DLL을 로드하고 결과를 Flutter 앱으로 반환합니다.
  • 통신 방식: IPC (Inter-Process Communication) 또는 Socket/HTTP.

2) 구현 방식

A. 브리지 프로세스 (32비트 네이티브 앱)

32비트 네이티브 앱(예: C++ 또는 C#)을 만들어 DLL을 로드하고 Flutter와 통신합니다.

C++ 예제:

#include <windows.h>#include <iostream>typedef int(__stdcall* AddFunc)(int, int);

int main() {
    HINSTANCE hDll = LoadLibrary("example.dll");
    if (!hDll) {
        std::cerr << "Failed to load DLL\\n";
        return 1;
    }

    AddFunc add = (AddFunc)GetProcAddress(hDll, "add");
    if (!add) {
        std::cerr << "Failed to get function address\\n";
        return 1;
    }

    int result = add(10, 20);
    std::cout << "Result: " << result << std::endl;

    FreeLibrary(hDll);
    return 0;
}

B. Flutter와 브리지 간 통신

  • Flutter에서 브리지 프로세스를 실행하고 데이터를 주고받습니다.
  • Dart Process 클래스를 사용:
import 'dart:io';

void main() async {
  final process = await Process.start('bridge_process.exe', []);
  process.stdout.transform(SystemEncoding.decoder).listen((data) {
    print('Bridge response: $data');
  });

  process.stdin.writeln('10 20'); // 브리지에 데이터 전달
}


4. 추가 고려사항

1) 성능

  • 브리지 프로세스 방식은 IPC 오버헤드가 있으므로 빈번한 호출에는 적합하지 않을 수 있습니다.

2) DLL 호환성

  • 32비트 DLL은 32비트 환경에서만 동작합니다. 이를 위해 호환되는 브리지 프로세스가 필요합니다.

3) 코드 서명

  • 32비트 DLL이나 브리지 프로세스를 사용하면 배포 시 코드 서명이 필요할 수 있습니다.

5. 결론

  • 간단한 솔루션: Flutter 앱을 32비트로 빌드하여 DLL과 직접 통합.
  • 복잡한 솔루션: 64비트 앱을 유지하면서 브리지 프로세스를 통해 DLL 호출.

Flutter 앱에서 32비트 DLL을 사용해야 한다면, 앱의 아키텍처와 요구사항에 따라 적절한 방법을 선택하세요.



🎬 유튜브 채널 🎬

 

위로그@WiLog

📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌

www.youtube.com

🎬 치지직 채널 🎬

 

위로그 채널 - CHZZK

지금, 스트리밍이 시작됩니다. 치지직-

chzzk.naver.com


반응형