C++ で記述された DLL を私の C コードにロードすることは可能でしょうか。
はい、すべてのランタイム要件が満たされている限り、作成に使用された言語に関係なく、C コードを使用して共有オブジェクト (または動的にリンクされたライブラリ) を読み込むことができます。
DLL 言語に依存していますか?
共有オブジェクト自体は何らかの形式のバイナリです (つまり、Linux ではELFです)。それが作成された言語とは何の関係もありません。たとえば、理論的には 16 進エディタで DLL を作成できるため、作成元の «言語» はありません。
それは、C++ DLL、C DLL、または C# DLL と呼ばれるものですか?
理論的には、たとえば C++ コードをコンパイルして作成されたことがわかっている場合、DLL を «C++ DLL» として呼び出すことができます。あるいは、C++ 固有のランタイム ライブラリに依存している場合もあります。ただし、システムの観点からは、これは依然として実行可能なバイナリ オブジェクトであり、システムはそれを作成するために使用された言語やコンパイラ (存在する場合) を気にしません。
…同じ言語のコードでのみ DLL を呼び出すことができるということですか?
いいえ。
オンラインで検索したところ、C++ 環境で C を呼び出すことについて何かが見つかりました。
コンピュータ プログラムとオペレーティング システムまたは別のプログラムとの間の低レベル インターフェイスを記述するApplication Binary Interface (ABI)に注意する必要があります。C++ の場合、他のすべてに加えて、シンボル名がどのようにマングルされているか、どの例外メカニズムが使用されているかを知る必要があります。そして、それは特定のマシン/オペレーティング システム/コンパイラの組み合わせに依存します。
そのことを知っていて、«C++ DLL» がロード可能で実行可能である (つまり、実行時の依存関係がすべて存在する) 場合、C プログラムでその DLL をほとんどホストできます (その DLL が «extern "C" を介して C インターフェイスを提供しなくても)。 » ステートメント)。たとえば、オブジェクト (つまり、クラス) のサイズ、そのレイアウト要件、マングルされたコンストラクター/デストラクター関数名 (存在する場合) がわかれば、メモリを割り当ててそのオブジェクトを構築できます。次に、メソッドのマングル名と «this» ポインターがどのように渡されるかを知っていれば、それらを呼び出すことができます。
それをしないでください!
そうは言っても、これはあなたがやろうとする必要がある最後のことです。その DLL の ABI に一致する適切な C++ コンパイラを取得し、使用するインターフェイスを記述したヘッダー ファイルを取得して、通常のユーザーと同じように使用する方がはるかに簡単です。ハッキングを試みるよりも、その DLL の機能を自分で実装する方が簡単な場合もあります。では、他のものを試してみてください。善良なサマリア人がコメントですでに示唆しているように、「DLL を提供した人に、DLL の適切な使用方法を尋ねてください」
幸運を!