delphiからopenVR dllを使用しようとしています。 しかし、このDLLは限られた機能を輸出しているだけで、多くの機能はインターフェースの中にとどまっています。ポインタのみでdll関数を呼び出す
openVRを使用するためのサンプルがあるので、c version headerとc# version headerを見てください。
私はC#ヘッダーでは、関数テーブルを格納するためにsome struct(デルファイのインターフェイスのような)を使用しており、an class(デルファイの実装クラスのような)その構造体、クラス内には、作成機能があります。魔法使いは、これらすべての関数へのポインタをハックするようです。
IVRSystem FnTable;
internal CVRSystem(IntPtr pInterface)
{
FnTable = (IVRSystem)Marshal.PtrToStructure(pInterface, typeof(IVRSystem));
}
pInterface
ポインタが実装クラスのセットが含まれて大きなクラスで与えられています。
public CVRSystem VRSystem()
{
CheckClear();
if (m_pVRSystem == null)
{
var eError = EVRInitError.None;
var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRSystem_Version, ref eError);
if (pInterface != IntPtr.Zero && eError == EVRInitError.None)
m_pVRSystem = new CVRSystem(pInterface);
}
return m_pVRSystem;
}
ここで、OpenVRInterop.GetGenericInterface
は、dllによってエクスポートされた関数の1つです。
だから私の問題は、次のとおりです。
(1)C#は何をするかのような何かをしたデルファイことができますか?私はdllでdllを扱っていましたが、2つの方法(静的と動的)では関数名が必要です。
function someFunction(a : integer) :integer; stdcall; external ’someDll.dll’;
dllHandle := LoadLibrary(’someDll.dll’);
@someFunction := GetProcAddress(dllHandle,'someFunction');
(2)cヘッダーはどのようにライブラリの読み込みを行ったのですか?そこに関連するコードは見つかりませんでした。
1つの事:C#とDLLの間で整理されなければならないことがあるため、素敵なプレーンなCヘッダーよりも翻訳するのが少し難しいです。 CとDelphiはお互いをよく理解しています。だから、C#のデモを使うのではなく、Cのデモを試してみてください。もちろん、それはおそらくポインタを使用します。 –
C#のマーシャリングをコピーするのは便利ではありません。あなたは理解を得る必要があります。ショートカットはありません。 –
OpenVR APIは、C++抽象クラスに基づく非COMインターフェイスを使用しています。 Delphiは消費するC++クラスをサポートしていないため、インタフェースサポートに異なるモデルを使用しています。 C#コードは、C++クラスのメモリレイアウトに合わせてシミュレートされたvtableポインタを含むプレーンな構造体を整列化することで、この問題を回避します。 Cユーザーは、C++ベースのCOMインターフェイスを使用する場合にも同じことを行う必要があります。 Delphiでも同様のことを行う必要があります。そのため、Cコードの代わりにC#コードを変換すると、この状況ではより意味があります。 –