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&
정규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&