ref/Win APP

DLL 만들기

민성아빠 2003. 2. 12. 12:15
dll에는요 정규 dll이랑 확장 dll이 있거든요

정규dll은 c언어 함수를 호출할수 있는 dll이에요

디엘엘 만들때는 MFC위자드로 만들면 편해요

Regular DLL with MFC statically linked <== 요놈이나

Regular DLL using shared MFC DLL <==요놈 선택하면 정규디엘엘 만드는거에요

그러면 소스파일에 파일이 4개가 생기거든요

그중에서 두개가 cpp파일인데요 stdafx.cpp 이거 말구요 다른 cpp 파일에다가요

함수 선언하고 정의하면 된요

그리고 함수 선언할때에는요

함수 앞에다가 extern "C" __declspec(dllexport) 이거 쓰고 해야돼요

왜냐면 extern "C" __declspec(dllexport) 라고 선언해야 dll 외부에서 호출해서 쓸수 있는 함수가 되는거
에여

그러니까 예를들어

extern "C" __decslpec(dllexport) void SetData(int n); <==이런식으로 선언를 해야돼요

그리고 정의할때에두요

__declspec(dllexport) void SetData(int n) <=====요기다 이렇게 써줘야해요
{
....
}


함수 다 만들고컴파일하면요 이상한 창이 하나 뜨거든요

그건 디버그할때 쓰는건데 지금은 필요 없으니까 그냥 닫으면 되요

컴파일하구 나면 dll 파일이랑 lib파일이 있는데요

dll 파일은 windows/system 에다가 놓구요

lib 파일은 비쥬얼씨 디렉토리에 라이브러리 디렉토리에다 두면 되요

그리고 만들어논 dll 사용할때는요

메뇨->프로젝트세팅->라이브러리탭에다가 lib파일이름 쓰고요

dll에서 끓어다 쓸 함수를 선언만 해주면 되거든요

선언하때는요 위랑 거의 비슷해요

extern "C" __declspec(dllimport) void SetData(int n); 이렇게 하면 그 함수를 쓸수 있는거에요

여기까지 정규dll implicit링킹방법이었습니다요


============================================================================================================


1. my_dll.cpp
You should use cpp as file extension.

#include <stdio.h>
#include <string.h>

extern "C" __declspec(dllexport) int __stdcall add_int(int a, int b){
        return a + b;
}

extern "C" __declspec(dllexport) int __stdcall ret_str(char res[]){
        strcpy(res, "0123456789");
        return 0;
}

extern "C" __declspec(dllexport) int __stdcall add_str(char *line, char res[]){
        sprintf(res, "%s + kk.. 케케...", line);
        return 0;
}

---------------------------
2. my_dll.def

LIBRARY        "my_dll"
DESCRIPTION        'my_dll Windows Dynamic Link Library'
EXPORTS
add_int
ret_str
add_str

---------------------------
3. vb

Option Explicit

Private Declare Function add_int Lib "my_dll.dll" (ByVal A As Integer, ByVal B As Integer) As Integer
Private Declare Function ret_str Lib "my_dll.dll" (ByVal res As String) As Integer
Private Declare Function add_str Lib "my_dll.dll" (ByVal line As String, ByVal res As String) As Integer

Private Sub Form_Load()
    'add_int
    write_line Text, add_int(21, 54)
    
    'ret_str
    Dim line As String * 1024
    ret_str line
    write_line Text, Left(line, InStr(line, Chr(0)) - 1)
    
    'add_str
    add_str "하하..", line
    write_line Text, Left(line, InStr(line, Chr(0)) - 1)
End Sub

Private Sub write_line(TextBox As TextBox, line As Variant)
    TextBox.Text = TextBox.Text & line & vbNewLine
End Sub

============================================================================================================

**** 인수(Parameter)의 전달
디폴트로 선언되는 것은 Call By Reference, Call By Value는 반듯이 ByVal이라고 명시해준다.
Ex : Call By Reference
Declare Function CreateFontIndirect Lib "gdi32" Alias "CreateFontIndirectA" _
    (lpLogFont As LOGFONT) As Long
Ex : Call By Value
Declare Function CreateHalftonePalette Lib "gdi32" Alias "CreateHalftonePalette" _
    (ByVal hdc as Long) As Long


**** 데이터 타입
--------------------------------------------------
C,C++      Visual Basic          NULL값 처리
--------------------------------------------------
WORD       Integer(Long)         0
DWORD      Long                  0&
LPCSTR     String                VbNullString
LPSTR      String                VbNullString
LPVOID     Any                   0&
BOOL       Integer(Long)         0
LONG       Long                  0,0&
BYTE       Byte,String           0.0&.VbNullString
UINT       Long                  0,0&
HANDLE     Long                  0,0&
HWND       Long                  0,0&