我正在尝试使用 delphi 的 openVR dll。然而,这个 dll 只导出了有限的功能,很多功能都留在接口内。
因为有一些使用 openVR 的示例,所以我看一下 c 版本标头和c# 版本标头,看看它们是如何做到的。
我从 c 标头中获得的知识并不多,而在 c# 标头中,我注意到他们正在使用一些结构(如 delphi 中的接口)来存储函数表,并有一个用于该结构的类(如 delphi 中的实现类) ,在类内部有一个创建函数,女巫似乎破解了指向所有这些函数的指针。
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) delphi 可以做 C# 做的事情吗?似乎他只是通过原始指针(地址?偏移量?)调用这些函数我搜索了delphi处理dll,只有两种方式(静态和动态)都需要函数名。
function someFunction(a : integer) :integer; stdcall; external ’someDll.dll’;
dllHandle := LoadLibrary(’someDll.dll’);
@someFunction := GetProcAddress(dllHandle,'someFunction');
(2) 库的c头是怎么加载的?我在那里没有找到相关的代码。