기본 콘텐츠로 건너뛰기

라벨이 DLL인 게시물 표시

Use VC++ to create a DLL file and use its functions in Visual Basic 6 Programming Tips

VB에서 VC DLL을 호출 할때 호출 규약 오류 때문에 DLL을 찾을수 없다고 메세지를 띄울 때 처리하는 방법입니다. 저희 회사는 아직도 VB 6.0을 사용하고 있거던요.(지금도 UI를 VB로 개발해요 ㅠㅠ) 간단히 말하면 VC에서 __stdcall 호출 규약을 사용하여 DLL 함수를 만들구요, VB쪽에서 함수를 선언할때 DLL 전체 경로를 주고요, 또한 Alias를 설정해 줍니다. 배포할 때 주의 사항은 DLL 전체 경로를 주면 실행시 해당 경로에 DLL을 찾기 때문에 오류가 발생할수 있습니다. 따라서 DLL 전체 경로를 없애야 합니다.(대부분이 DLL을 실행 파일이랑 같이 두니까요) 원본 : http://b4you.net/blog/tag/%ED%98%B8%EC%B6%9C%EA%B7%9C%EC%95%BD VC에서 만든 DLL을 VB에서 사용할 때 애먹고 있으신 분들을 위해.. 참고로, 굳이 프로젝트 세팅에서 __stdcall 방식으로 바꿀 필요는 없다. 이렇게 하면 c 코드를 작성하는 모든 부분의 데이터를 이상하게 처리해야될지 모르므로 -ㅅ-;; 각 함수마다 __stdcall을 이용하면되는데.. 예를 들면 int __stdcall a(){} 와 같이 함수 선언부에 __stdcall를 붙이면 이 함수만 __stdcall 규약을 따르게 될 수 있다. P.S. 보통 Windows API들이 __stdcall을 따른다. 그 이유는, Windows에서 제공하는 API들은 VC, VB, Delphi 등등의 프로그램에서 사용되어야 하므로 표준 규약인 __stdcall을 지키는것이며, 그래서 VC에서 Windows API들이 선언된 것을 보면 WINAPI 라고 된 것을 볼 수 있다. 이 WINAPI는 PASCAL 형이며, PASCAL은 _pascal 의 별칭이다. (wtypes.h에 define 되어 있으며, pascal과 stdcall방식은 서로 같다. pascal방식은 caller가 stack을 삭제하는 것이다.) ...

VC에서 VB DLL 호출하기

원본 따라가기 : http://alexk.springnote.com/pages/2954834 제일 밑의 <추가> 부분이 제가 VB를 사용하는 이유입니다. VB DLL은 액티브엑스 방식이어서 일반 VC에서 사용하는 DLL호출방법은 쓸 수가 없습니다. 여기 VB DLL을 불러서 사용하는 괜찮은 방법을 소개할 까 합니다. 제가 지금 사용중인데 매우 잘 돌아갑니 다. 1. VB으로 MurickCom이라는 프로젝트에 clsMurick라는 클래스를 만들어서 함수를 등록시킵니다. 2. 주의사항은 될 수 있는데로 함수에서 사용하는 리턴형과 아규먼트의 타입을 정확히 기재합니다.이것을 안해주게 되면 나중에 C에서 Variant라는 잡변수형태로 나타나게 됩니다. 이거 처리하는거 어렵습니다. 예를 들어 Public Function CountStringLength(ByVal strValue As String) As Long If strValue = vbNullString Then CountStringLength = 0 Else CountStringLength = Len(strValue) End If End Function 라고 합니다. 3. DLL을 만듭니다. 예를 들어 C:\Murick에 만들었다고 가정하지요. File -> Make MurickCom.dll 4. 그리고 Visual Studio 6.0 폴더에 Visual Studio 6.0 도구들이라고 있습니다. 여기에 OLEViewer라고 있습니다. 요놈을 클릭하면 어플리케이션이 나타나는데 좌측 트리에 Type Libraries를 더블클릭합니다. 그밑으로 현재 사용중인 OLE의 DLL파일들이 좌악 나타나지요. 제목으로 방금 만든 MurickCom.dll을 찾습니다. 만약 외부에서 만든 dll이면 시작 메뉴 -> 실행 -> regsvr32 경로\~.dll 엔터를 치시면 등록됩니다. 5...

[VB] DLL 호출

간만에 VB 6.0으로 작업할 일이 생겼는데, VC 6.0으로 만든 DLL 함수를 호출하고 나서 프로그램이 죽는 현상이 발생했습니다. 그 DLL은 이제까지 아무 문제 없이 잘 사용해 왔습니다. 그 원인을 몰라 한참이나 코드를 들여다 보고 있다가, 문득 DLL 호출은 일반 함수에서 하면 에러가 발생한다는 얘기를 생각해 내었습니다. 'DLL 함수 호출은 이벤트 처리 함수에서 호출해야 한다.' 그 이유는 잘 모르겠습니다.

DLL의 데이터 공유

dll의 프로세스간 데이터 공유를 위해서는 data_seg pragma를 사용한다. 이때 dll의 def 파일에 데이터 공유 섹션을 지정해야 한다는 것을 잊지 말도록.. (오늘 이거 땜에 또 삽질했다. -_-;;) 데이터 공유 섹션 지정 #pragma data_seg(".CACHE") HANDLE g_hCacheFile = INVALID_HANDLE_VALUE; #pragma 섹션 정의 (def 파일에) SECTIONS .CACHE Read Write Shared 이렇게 하면 g_hCacheFile은 이 dll을 로딩한 모든 프로세스에서 공유해서 사용할 수 있습니다.

dll 디버그용 릴리즈용 def 만들기

지크님의 블로그 | 지크 http://blog.naver.com/kji780929/110010052760 MFC dll 보시면 MFC42.dll과 MFC42D.dll이 있죠? D가 붙은건 DEBUG 버전의 DLL이예요. 아래는 이렇게 만드는걸 쉽게 하는 방법을 적은것입니다. 오후 1:05 2001-12-13 조경민 MFC DLL Debug/Release 구분해서 하기 ============================================================ Test.DLL 프로젝트를 만들면 Test.def라는 파일이 있다. 디버그 버전을 위해 이를 Testd.def로 바꾸고 내부에 ; Test.def : Declares the module parameters for the DLL. LIBRARY "Testd" <- d를 붙여준다. DESCRIPTION 'Testd Windows Dynamic Link Library' <- d를 붙여준다. EXPORTS ; Explicit exports can go here 그리고 Project/Setting에서 Debug에 대해 Link탭에서 Debug/Test.dll을 Debug/Testd.dll로 바꾼다. 그리고 아래 def 연결을 /def:test.def를 /def:testd.def로 바꿔준다. batch Build All을 해서 Debug/testd.lib Debug/testd.dll Release/test.lib Release/test.dll 를 얻는다. 클라이언트는 위의 파일들을 받아서 프로젝트...