C 언어의 정적 및 동적 링크 라이브러리 (노트)

비디오는 쓸 시간이 없다 감시 ...........

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;
}

 

추천

출처www.cnblogs.com/xuexidememeda/p/12327607.html