비디오는 쓸 시간이 없다 감시 ...........
C 정적 링크 라이브러리없이 사용하면 적은 비용으로 살아 가지 않을 별도의 모듈이없는 CPP 파일에서 함수를 작성처럼 대답
예
.H 파일
당신 플러스 ( 당신이 얻을 당신 Y); 당신이 하위 ( 당신이 얻을, 당신 Y); 당신 도난 ( 당신이 얻을 당신 Y); 당신 사업부 ( 당신이 얻을 당신 Y);
CPP
당신 플러스 ( 당신이 얻을, 당신 Y) { 반환 X + Y를; } 당신이 하위 ( 당신이 얻을, 당신 Y) { 반환 X- Y를; } 당신 도난 ( 당신이 얻을 당신 Y) { 반환 X * Y를; } INT 본부 ( INT의 X, INT Y) { 반환 X / Y를; }
lib 디렉토리 파일과 .H 파일을 컴파일 사용하면 같은 폴더에 lib 디렉토리 프로젝트를 사용할 필요가
당신의 LIB의 뒷면에 추가 할 프로젝트 속성을 라이브러리 모듈을 클릭
C 동적 링크 라이브러리
2 , 헤더 파일 통근 " C " _declspec (dllexport) __stdcall INT 플러스 ( INT의 X, INT Y); 통근 " C " _declspec (dllexport) __stdcall INT 하위 ( INT의 X, INT Y); 통근 " C " _declspec (dllexport) __stdcall INT 도난 ( INT (X), INT Y); 통근 " C " _declspec (dllexport) __stdcall INT 본부 (당신은 , 일을 하면 Y);
CPP
INT __stdcall 플러스 ( INT의 X, INT의 Y) { 반환 X + Y를; } int로 __stdcall 하위 ( INT의 X, INT y)를 { 반환 X- Y를; } INT __stdcall 도난 ( INT (X), INT의 Y) { 반환 X * Y를; } INT __stdcall 본부 ( INT (X), INT의 Y) { 반환 X / Y를; }
INT는 _declspec의 앞에 배치해야 할 수도 있습니다 대
플랫 스택 균형 스택 내의 수단 및 그 함수 반환 __stdcall
DLL 사용
한 가지 방법 : 암시 적 연결 1 단계 : * .DLL * lib 디렉토리 프로젝트의 다음 디렉토리에 2 단계 : 의 #pragma 주석 (lib 디렉토리, "DLL 이름 lib 디렉토리")는 호출 파일에 추가 3 단계 : 선언이 기능을 결합 통근 " C " __declspec (같이 DllImport) __stdcall INT 플러스 ( INT의 X, INT Y); 통근 " C " __declspec (같이 DllImport) __stdcall INT 하위 ( INT의 X, INT Y); 통근 " C " __declspec (같이 DllImport) __stdcall INT 도난 ( INT (X), INT Y); 통근 " C " __declspec (같이 DllImport) __stdcall INT 본부 (당신은 , 일을 하면 Y); 설명 : 플러스 통근 C는 C의 형태로 컴파일 __declspec (같이 DllImport)이 기능은 가져 오기 기능입니다 컴파일러를 알려줍니다;
두 번째 방법
두 번째 방법 : 쇼 링크 단계 1 : // 함수 포인터를 정의 타입 정의의 INT (lpPlus __stdcall *) ( INT , INT ); 타입 정의 INT (__stdcall * lpSub) ( INT , INT ); 타입 정의 INT (__stdcall * lpMul) ( INT , INT ); 타입 정의 INT (__stdcall * lpDiv) ( INT , INT ); 2 단계 : // 선언 함수 포인터 변수 lpPlus myPlus; lpSub mySub; lpMul myMul; lpDiv myDiv; 3 단계 : // // 동적 DLL을 메모리에로드 HMODULE가에서 LoadLibrary (= HINSTANCE " DllDemo.dll을 " ); 4 단계 : // 가져 오기 기능 주소 myPlus = (lpPlus)을 GetProcAddress를합니다 (HMODULE, " . _Plus @ 8 " ); mySub = (lpSub)의 GetProcAddress (HMODULE, " _Sub @ 8 " ); myMul = (lpMul)의 GetProcAddress (HMODULE, " _Mul @ 8 " ); myDiv = (lpDiv)의 GetProcAddress (HMODULE, " _Div @ 8 " ); 5 단계 : // 함수를 호출 INT A = myPlus ( 10 , 2 ), INT B = mySub ( 10 , 2 ), INT C = myMul ( 10 , 2 ), INT D = myDiv ( 10 , 2 );
팁 특정 함수 이름이 방법으로 만든 모습 DLL 기능 뷰어 기능 이름을 변경 무엇을 생성 할 수 있습니다
이름처럼 데프 내보내기 기능 및 함수 이름은 또한 다른 사람을 방지하기 위해 DLL 수출 익명의 전화로 정의 할 수 있습니다
CPP 파일과 헤더 파일과 라인에 서면으로 당신은 일반적으로 정의
1 , * .H 파일 int Plus (int x,int y); int Sub (int x,int y); int Mul (int x,int y); int Div (int x,int y); 2、*.cpp文件 int Plus(int x,int y) { return x+y; } int Sub(int x,int y) { return x-y; } int Mul(int x,int y) { return x*y; } int Div(int x,int y) { return x/y; }
3、*.def文件 EXPORTS Plus @12 Sub @15 NONAME Mul @13 Div @16
其中NONAME 不显示调用函数名 使用序号调用 关于文件怎么定义和配置可以参考一下 https://blog.csdn.net/hanxiucaolss/article/details/95079199
def匿名dll函数调用方法(和上面的类似只不过这个是序号调用)
#include "stdafx.h" typedef int( *lpPlus)(int, int); typedef int( *lpSub)(int, int); typedef int( *lpMul)(int, int); typedef int( *lpDiv)(int, int); int _tmain(int argc, _TCHAR* argv[]) { lpPlus myPlus; lpSub mySub; lpMul myMul; lpDiv myDiv; HINSTANCE hModule = LoadLibrary(L"windll.dll"); /* Handle 是代表系统的内核对象,如文件句柄,线程句柄,进程句柄。 HMODULE 是代表应用程序载入的模块 HINSTANCE 在win32下与HMODULE是相同的东西 Win16 遗留 HWND 是窗口句柄 其实就是一个无符号整型,Windows之所以这样设计有2个目的: 1、可读性更好 2、避免在无意中进行运算 */ myPlus = (lpPlus)GetProcAddress(hModule, (char*)12);//这里的12是你原来定义的序号//mySub = (lpSub)GetProcAddress(hModule, "_Sub@8"); //myMul = (lpMul)GetProcAddress(hModule, "_Mul@8"); //myDiv = (lpDiv)GetProcAddress(hModule, "_Div@8"); //printf_s("%x", GetProcAddress(hModule, "Plus")); printf_s("%d", myPlus(1, 2)); return 0; }