//C++ ObjInf.dll
//---
#define DLL_EXPORT //省略...
#define API __stdcall//CallingConvention
extern "C"
{
struct ObjInf{
virtual Initial() = 0;
virtual Delete() = 0;
virtual Run
(int time) = 0; };
DLL_EXPORT ObjInf* API CreateObj();
};
//---
//C#
using System;
using System.Runtime.InteropServices;
namespace DllTest
{
[StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi)]
public struct ObjInf_vTable
{
[UnmanagedFunctionPointer(CallingConvention.ThisCall)]
public delegate void funInitial(IntPtr thisPtr);
[UnmanagedFunctionPointer(CallingConvention.ThisCall)]
public delegate void funDelete(IntPtr thisPtr);
[UnmanagedFunctionPointer(CallingConvention.ThisCall)]
public delegate
void funRun
(IntPtr thisPtr
, int time);
public funInitial Initial;
public funDelete Delete;
public funRun Run;
}
[StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi)]
public struct sObjInf
{
public IntPtr pTable;
}
class Program
{
[DllImport("ObjInf.dll", CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr CreateObj();
static void Main(string[] args)
{
IntPtr ThisPtr = CreateObj();
sObjInf obj = (sObjInf)Marshal.PtrToStructure(ThisPtr, typeof(sObjInf));
ObjInf_vTable objTable = (ObjInf_vTable)Marshal.PtrToStructure(obj.pTable, typeof(ObjInf_vTable));
objTable.Initial(ThisPtr);
}
}
}
Ly9DKysgT2JqSW5mLmRsbAovLy0tLQoKCgojZGVmaW5lIERMTF9FWFBPUlQgLy/nnIHnlaUuLi4gCiNkZWZpbmUgQVBJICBfX3N0ZGNhbGwvL0NhbGxpbmdDb252ZW50aW9uCgpleHRlcm4gIkMiCnsKICBzdHJ1Y3QgT2JqSW5mewogICAgdmlydHVhbCBJbml0aWFsKCkgPSAwOwogICAgdmlydHVhbCBEZWxldGUoKSA9IDA7CiAgICB2aXJ0dWFsIFJ1bihpbnQgdGltZSkgPSAwOwogIH07CiAgRExMX0VYUE9SVCBPYmpJbmYqIEFQSSBDcmVhdGVPYmooKTsKfTsKCgoKLy8tLS0KLy9DIwoKCnVzaW5nIFN5c3RlbTsKdXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOwpuYW1lc3BhY2UgRGxsVGVzdAp7CgogIFtTdHJ1Y3RMYXlvdXQoTGF5b3V0S2luZC5TZXF1ZW50aWFsLCBQYWNrID0gNCwgQ2hhclNldCA9IENoYXJTZXQuQW5zaSldCiAgcHVibGljIHN0cnVjdCBPYmpJbmZfdlRhYmxlCiAgewogICAgW1VubWFuYWdlZEZ1bmN0aW9uUG9pbnRlcihDYWxsaW5nQ29udmVudGlvbi5UaGlzQ2FsbCldCiAgICBwdWJsaWMgZGVsZWdhdGUgdm9pZCBmdW5Jbml0aWFsKEludFB0ciB0aGlzUHRyKTsKCiAgICBbVW5tYW5hZ2VkRnVuY3Rpb25Qb2ludGVyKENhbGxpbmdDb252ZW50aW9uLlRoaXNDYWxsKV0KICAgIHB1YmxpYyBkZWxlZ2F0ZSB2b2lkIGZ1bkRlbGV0ZShJbnRQdHIgdGhpc1B0cik7CiAgICAgICAgCiAgICBbVW5tYW5hZ2VkRnVuY3Rpb25Qb2ludGVyKENhbGxpbmdDb252ZW50aW9uLlRoaXNDYWxsKV0KICAgIHB1YmxpYyBkZWxlZ2F0ZSB2b2lkIGZ1blJ1bihJbnRQdHIgdGhpc1B0ciAsIGludCB0aW1lKTsKCiAgICBwdWJsaWMgZnVuSW5pdGlhbCBJbml0aWFsOwogICAgcHVibGljIGZ1bkRlbGV0ZSBEZWxldGU7CiAgICBwdWJsaWMgZnVuUnVuIFJ1bjsKICB9CiAgICAKICAgIAogIFtTdHJ1Y3RMYXlvdXQoTGF5b3V0S2luZC5TZXF1ZW50aWFsLCBQYWNrID0gNCwgQ2hhclNldCA9IENoYXJTZXQuQW5zaSldCiAgcHVibGljIHN0cnVjdCBzT2JqSW5mCiAgewogICAgcHVibGljIEludFB0ciBwVGFibGU7CiAgfQoKICBjbGFzcyBQcm9ncmFtCiAgewogICAgW0RsbEltcG9ydCgiT2JqSW5mLmRsbCIsIENhbGxpbmdDb252ZW50aW9uID0gQ2FsbGluZ0NvbnZlbnRpb24uU3RkQ2FsbCldCiAgICBwdWJsaWMgc3RhdGljIGV4dGVybiBJbnRQdHIgQ3JlYXRlT2JqKCk7CgoKICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKICAgIHsKICAgICAgSW50UHRyIFRoaXNQdHIgPSBDcmVhdGVPYmooKTsKICAgICAgc09iakluZiBvYmogPSAoc09iakluZilNYXJzaGFsLlB0clRvU3RydWN0dXJlKFRoaXNQdHIsIHR5cGVvZihzT2JqSW5mKSk7CiAgICAgIE9iakluZl92VGFibGUgb2JqVGFibGUgPSAoT2JqSW5mX3ZUYWJsZSlNYXJzaGFsLlB0clRvU3RydWN0dXJlKG9iai5wVGFibGUsIHR5cGVvZihPYmpJbmZfdlRhYmxlKSk7CgogICAgICBvYmpUYWJsZS5Jbml0aWFsKFRoaXNQdHIpOwogICAgfQogIH0KfQo=