小编Ale*_*zin的帖子

从C#Code调用delphi DLL函数

我有一个在Delphi 2007中编译的DLL和一个在其他Delphi项目中使用它的例子.这是代码的一部分:

TErrorCallback = function(Msg:PChar):byte of object;
TSaveEventCallback = function (Line:PChar; HiCode:PChar; LoCode:PChar; MobileNo:PChar):byte of object;

function InitModule(ErrorCallback:TErrorCallback; SaveEventCallback :TSaveEventCallback; MainWindowHandle:THandle; Sock_Event:integer):byte; stdcall; external 'My.dll' name 'InitModule';

function DLLSocketEvent(var msg: TMessage): byte; stdcall; external 'My.dll' name 'DLLSocketEvent';

function InitObjList(Objs: array of PChar; NumObjs: byte; Name: PChar):byte; stdcall; external 'My.dll' name 'InitObjList';
Run Code Online (Sandbox Code Playgroud)

这是我的C#模拟:

class Message
{
  unsigned int msg;
  int wParam;
  int lParam;
  int result;
};
delegate byte ErrorCallbackDelegate(string msg);
delegate byte SaveEventCallbackDelegate(string line, string hiCode, string loCode, string mobileNo);

[DllImport("My.dll")] …
Run Code Online (Sandbox Code Playgroud)

c# delphi pinvoke

7
推荐指数
1
解决办法
1920
查看次数

如何在C#中枚举COM对象的成员?

我通过COM连接到某个程序并接收System .__ ComObject.我知道它的几种方法,所以我可以这样做:

object result = obj.GetType().InvokeMember("SomeMethod", BindingFlags.InvokeMethod, null, obj, new object[] { "Some string" });
Run Code Online (Sandbox Code Playgroud)

并且喜欢这个

dynamic dyn = obj;
dyn.SomeMethod("Some string");
Run Code Online (Sandbox Code Playgroud)

两种方法都很好.但是如何确定com对象的内部类型信息并通过其所有成员进行枚举?

我试过这个:

[ComImport, Guid("00020400-0000-0000-C000-000000000046"),
  InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IDispatch
{
  void Reserved();
  [PreserveSig]
  int GetTypeInfo(uint nInfo, int lcid, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(TypeToTypeInfoMarshaler))] out System.Type typeInfo);
}

...

IDispatch disp = (IDispatch)obj;
Type t;
disp.GetTypeInfo(0, 0, out t);
Run Code Online (Sandbox Code Playgroud)

但是t最后是空的.谁能帮我?

.net c# com

5
推荐指数
2
解决办法
6759
查看次数

标签 统计

c# ×2

.net ×1

com ×1

delphi ×1

pinvoke ×1