본문 바로가기

DLL

(7)
MinGW-W64 + glut32 예제 컴파일 하기 이전에 올린 MinGW-W64 에 기본으로 포함 되지 않는 glut32 를 만드는 방법을 다음으로, 간단히 OpenGL GLUT Example 페이지에 있는 blender.c 예제를 컴파일 해 보도록 하겠습니다. 먼저 아래의 압축 파일을 특정 위치에 푼 다음 (blender.c 소스 포함임) 해당 위치에 기존의 glut32.dll 을 복사 해 두고 make 를 해서 blender.exe 를 만들 수 있습니다. 단, 이 소스를 빌드 하기 이전엔 반드시 glut32 를 MSYS 에 make install 로 설치한 상태여야 합니다. Windows 의 정책 상 DLL 이 EXE 와 함께 있거나, Windows system 폴더 안에 복사가 되어 있어야 하므로, DLL 을 먼저 복사 해 오는 것을 고려해야 EX..
DLL 에서 dllmain 이 호출 되지 않는다 !!! 언젠가 부터, 저는 DLL 을 minGW 에서 만듭니다. 하나의 소스로 Target 만 바꿔서 32bit, 64bit 모두 찍어 낼 수 있도록 환경을 만들어 쓰다 보니 이게 너무 편했던 것이죠. 그런데, 어느순간 제가 "정석" 을 따르고 있지 않음을 깨닫게 됩니다. 그 일이 이번에 DllMain() 함수가 불리지 않는다는 것. 이전에 C 코드를 짤떈 잘 쓰이던 것이 왜 이번에 이러지? 라는 의문이 든 것이 바로 이 결과 때문 입니다. 위 이미지만 봐서는 뭐가 문제인지 모를 것 입니다만 .. 아래 코드를 보겠습니다. 중요한 것은 바로 DllMain() 함수가 불리지 않는 다는것. 중복된 프로세스에서 사용되거나, 쓰레드에 사용될 경우 기본적인 처리를 해 줘야 할 DllMain() 이 호출 없이 사용된다는 점..
minGW x86-64bit, DLL 빌드시 libc++ 문제 해결. 현재, 일반적으로 사용할 수 있는 컴파일러 중 64bit Win32.PE 를 생성 할 수 있는 것은 minGW 말고는 없는 걸로 알고 있습니다. 상용 컴파일러 로는 뭐가 있는지 알수 없기 때문이기도 합니다만 -_-;; intel 같은데서 나오는 컴파일러는 64bit 를 지원 하겠죠. 하지만 범용적으로 쓰기엔 어려움이 있으므로, 저는 gcc 의 windows 판인 minGW 를 사용합니다. 릴리즈 버젼 4.5.5 를 현재 사용하고 있으며, OpenSource 로서 SourceForge 에서 개인 릴리즈 버젼으로 다운로드 받을 수 있습니다. 언제나 그렇듯 ... minGW 는 상용 컴파일러가 아니므로, 해당 컴파일러로 만들어진 바이너리가 오동작 해도 그에 대한 warranty 는 전혀 없습니다! 현재 64b..
C# 에서 DLL 로드 동적으로 하기. C# 에서 C# 용으로 만들어진 DLL 이 아니고서는 C++ 이나 C , Delphi 등에서 쓰듯이 LoadLibrary 로 불러 쓰는 방법이 DllImport 말고는 방법이 없을까요? 물론 있습니다. 그 DllImport 를 이용하여 다음 세가지의 함수를 kernel32.dll 에서 import 해 온 다음 사용하면 됩니다. 가장 먼저 필요한 것은 LoadLibrary() , GetProcAddress(), FreeLibrary() 이 세가지가 되겠습니다. 그리고 이 세가지 함수는 다음 방법으로 제작하려는 class 내에 선언 해 주면 됩니다. [DllImport("kernel32.dll", EntryPoint = "LoadLibrary")] private extern static int LoadLib..
C# 에서 일반 DLL 가져다 쓰기. C# 이 편리한 언어라고들은 합니다만 .. 사실 저는 편한지 전혀 모르겠습니다 -_-a Java 처럼 가져다 쓰기 편하다는 의미로서는 그 의미대로 편한 것 이 맞는 말 입니다만 ... 개발자가 그런 편리함으로 "편리하다" 라고 하는 건 사실 개발자로서의 자질이 의심 된다고 생각 되네요 .. 어찌되었든.. minGW (gcc) 에서 빌드한 32bit DLL 을 C# 에서 쓸수 있는걸까? 라는 생각을 해 본 결과 : 된다 입니다. 다만 테스트 한 환경이 XP 인데다 32bit OS 이므로 64bit OS 에서는 void* 타입이 4byte 가 아니고 8byte 이므로 분명히 문제가 생길 것으로 생각 되는군요. 일단 이전에 공유한 SHARERES.DLL 을 붙여다 보았습니다. 동작은 .. 됩니다. DLL 을 ..
프로세스간 메모리 공유를 위한 DLL : SHARERES.DLL v0.3.11.16 서로 다른 프로세스 간 메모리 공유를 위해 만들은 SHARERES.DLL 입니다. 공용메모리가 처음 생성되는 instance 에서 생성되고, reference count 가 증가 되어도 같은 동일한 메모리에 데이터를 참조 합니다. 내부적으로 메모리 포인터를 직접 사용자에게 인터페이스로 넘겨 주도록 만들어 지진 않았습니다. 또한 다른 프로세스가 write / read 시엔 내부 메모리가 Lock 이 되도록 만들어 졌습니다. 보통 500MB ~ 1GB 내의 메모리를 만들어 쓸 수 있으며, 그 이상의 크기는 퍼퍼먼스가 날 수 있을지 잘 모르겠네요. 표준 윈도우 DLL 로 만들어 졌으며, 범용성을 고려해서 stdcall 로 만들까 하다가 cdecl 로 만들었습니다. 자세한 정보는 첨부된 파일을 보시면 알 수 있..
C++ 에서 만든 DLL 과 math 연동시 오류 : Invalid Floating Point Operation 어느 댓글을 남겨 주신 광란의사랑님 말씀대로 이때까지 해 보지 않았던 math 연동 DLL 을 테스트 해 보았습니다. 일단 델파이 에서는 표시 할 수 없는 -1.#INF 가 나오므로 FloatToStr() 함수를 거치면 NAN 으로 표시 됩니다. 그냥 만들게 되면 Invalid Floating Point Operation 오류 가 발생 하는데, 이는 Delphi 의 FPU monitor 플래그 때문에 발생 하는 문제 입니다. 이 문제는 다음 실제 사용된 코드와 같이 쓰시면 해결이 가능합니다. 아래에 예제 샘플을 추가 합니다. 사용된 툴은 CodeBlocks 와 minGW , 그리고 TurboDelphi Explorer(2006) 입니다. 압축을 풀면 CUSTMATH 디렉터리와 , DELPHI 가 각각 있..