C言語でDLLダイナミックライブラリを作成して呼び出す

序文

 C++ が DLL 内の関数を呼び出す場合、それが企業内にある場合は、3 つの部分からなるスーツ (.h\.lib\.dll) である必要があります。このようにして、作成者はヘッダー ファイルに多くの情報を書き込むことができるため、呼び出し元にとっては便利です。ただし、それが他社の人々によって使用され、他の人に見られたくない場合は、作成者は間違いなく他の人にあまり多くの情報を見られたくないので、それを呼び出すだけです。

   もう一つのポイントは、デバッグ時に dll を使用し、コンパイル時に lib を使用するという点であり、この 2 つは異なるタイミングで使用されるツールです。

純粋に自分自身の理解のためにこれを書いています

1.DLLの作成

まず空の DLL ファイルを作成します。作成方法: [新規作成] - [プロジェクト] - [Win32 コンソール プログラム] - 次に名前を付けます - [OK] - [次へ] - DLL を選択 - 空のプロジェクトを確認します。Dll1 という名前の新しいプロジェクトが正常に作成されました。プロジェクトには次のものがあります(VS2017)

 ヘッダーファイル Dll1.h を追加 ヘッダーファイルにエクスポート関数 add 関数を追加

#pragma once

extern "C" __declspec(dllexport) int add(int a, int b);
//extern "C" 是表示C语言代码,优点通常调用动态库不改变函数名,具体的找相关文献
//_declspec(dllexport) 导出函数,我是这么理解的

 次に、それを Dll1.cpp ファイルに実装します。

    #include "Dll1.h"
    int add(int a, int b) {
     
    	return a + b;
    }

次にコンパイルしますが、プラットフォームの設定に注意してください

(要件に応じて選択してください)

/*

x86 と x64 の違い:

x86 プラットフォームでコンパイルされた exe (実行可能ファイル) または dll (ダイナミック リンク ライブラリ) は 32 ビットであり、対応する x64 プラットフォームは 64 ビットです。

スタートアップ プロジェクト、つまりメイン プログラム (exe ファイルにコンパイルされる) が x86 プラットフォームでコンパイルされ、それが依存するプロジェクト (またはダイナミック リンク ライブラリ) が x64 プラットフォームからコンパイルされる場合、「できませんでした」というプロンプトが表示されます。ファイルまたはアセンブリをロードします...またはその依存関係の 1 つです。不正なプログラムをロードしようとしました。」というエラーが発生します。これは、32 ビット プログラムでは 64 ビット DLL をロードできないため、ましてやその中のクラス、メソッド、オブジェクトを呼び出すこともできないためです。逆に、メイン プログラムが x64 プラットフォームでコンパイルされているが、dll が x86 である場合はどうなるでしょうか? 答え。それも受け入れられません!
———————————————
著作権に関する声明: この記事は CSDN ブロガー「Madman's Looking Up」のオリジナル記事であり、CC 4.0 BY-SA 著作権契約に従い、元の情報源を添付してください。リンクとこの声明。
元のリンク: https://blog.csdn.net/admainzl/article/details/101850906

*/

無駄に譲歩しないように、発信者と一貫性を保つようにしてください。

次に「生成」をクリックします

x64-deBug ディレクトリで Dll1.dll と Dll1.lib を見つけます。

 2.1 DLL ダイナミック ライブラリの呼び出しメソッド 1

DLL の作成は終了しました。新しい Win32 コンソール プログラムを作成し、Test という名前を付ける必要があります。

まず、プロジェクトの下に Dll1.dll と Dll1.lib を追加します (2 つのファイルはソフトウェアと同じフォルダーに配置する必要があります)。

次に、次のコードを Test.cpp に追加します。

//静态调用DLL库的方法
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

#pragma comment(lib,"Dll1.lib")//表示链接Dll1.lib这个库。
//(注意数字1和字母l)
/*
更多关于#pragma comment()的去看链接

https://blog.csdn.net/weixin_34405925/article/details/86285203?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163913902116780271950822%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163913902116780271950822&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-86285203.first_rank_v2_pc_rank_v29&utm_term=%23pragma+comment&spm=1018.2226.3001.4187
*/

extern "C" __declspec(dllimport) int __stdcall add(int a, int b);
//__declspec(dllimport) 导入包
// 静态调用DLL库
void main()
{
	int sum = add(10, 20);
	printf("静态调用,sum = %d\n", sum);
}

 2.2 DLL ダイナミック ライブラリの呼び出し方法 2

 プロジェクトの下に Dll1.dll を追加するだけで、Dll1.lib は必要ありません

#include <iostream>
#include<Windows.h>
int main()
{
	HMODULE h = NULL;//创建一个句柄h
	h = LoadLibrary("Dll1.dll");
	if (h == NULL)//检测是否加载dll成功
	{
		printf("加载DLLTest1.dll动态库失败\n");
		return -1;
	}


	typedef int(*AddFunc)(int, int); // 定义函数指针类型
	AddFunc add;
	// 导出函数地址
	add = (AddFunc)GetProcAddress(h, "add");

	
	int sum = add(100, 200);
	printf("动态调用的结果%d\n", sum);
	
	return 0;
}

要約:

なし

この記事は、C/C++: Windows プログラミング - DLL プログラムを呼び出す 2 つの方法_Mr. Li Si-CSDN Blog_c++ 呼び出し DLL からのものです。

C/C++_Vaxy-CSDN を使用してDLL ファイルを作成する Blog_c DLL を作成する

拡張機能1.Dev C++ ツールは C コードを DLL ファイルに生成し、DLL を呼び出す方法 file_Forward no stop -CSDN Blog_devc++ dll

プッシュ2.ダイナミック リンク ライブラリ (dll) の作成_Unique Libra Blog-CSDN Blog_ダイナミック リンク ライブラリの作成

3. C/C++ダイナミックリンクライブラリ(DLL)の詳細説明

おすすめ

転載: blog.csdn.net/weixin_58503231/article/details/121863927