2014-12-09 92 views
0

我需要调用本地函数传递指针作为参数传递给本地函数的PInvoke

long (WINAPI*)(long,long*); 

在长*它会给我的结果

我这样做

​​

但此呼叫不起作用

Int32 Camera_Index= 0; 
Int32 Result; 
IntPtr Result_Pointer = IntPtr(Result); 

long Binning = Get_Current_Binning(Camera_Index, Result_Pointer); 

我有例外System.AccessViolationException 所以,功能不能写我的结果。

如何做到这一点?

谢谢。


更新

嘿,伙计们。 我不知道你是什么意思,但我确实问过,我问了什么。

-I正在使用C++ CLI。它是不是C#

-I需要的PInvoke。我无法从CLI项目调用DLL unmanaget

-i并通过这样找到了解决办法。你可以删除我的答案,给我一些不足之处,但它是有效的。这很糟糕?

[DllImport("mrfw.dll", EntryPoint = "[email protected]")] 
static long Get_Current_Binning(Int32, IntPtr); 

int main(array<System::String ^> ^args) 
{ 
Int32 Camera_Index= 0; 
Byte* Result= new Byte(4); 
IntPtr Result_Pointer = IntPtr(Result); 

long Binning = Get_Current_Binning(Camera_Index, Result_Pointer); 
} 
+0

入口点的名字说,该函数有一个** **的说法,而不是两个。从@ 4后缀可见。你正在处理糟糕的文档,或者只是在这个函数的正确的函数指针类型上猜错了。你可以尝试省略第二个参数作为一个疯狂的猜测,它肯定不会是一个IntPtr。联系供应商寻求支持。 – 2014-12-09 12:00:22

+0

@Hans Passant感谢你,我确实解决了这个问题,但接下来确实来了。还有一个问题给你:我如何学习阅读entery pont的名字? – Michail 2014-12-09 12:29:39

+0

http://stackoverflow.com/a/15664100/17034 – 2014-12-09 12:34:06

回答

1

您正在以混合模式编码C++/CLI,并且不需要p/invoke。如果您拥有的是不带.lib文件的DLL以及混合模式的C++/CLI程序,那么您有几个选项。

  1. 获取或创建DLL的.lib文件。然后以传统的方式使用隐式链接链接到DLL。
  2. 链接到使用显式链接与LoadLibraryGetProcAddress的DLL。

在这两种情况下,你就可以调用该函数是这样的:

long result; 
long retval = Get_Current_Binning(0, &result); 
// check retval for success, and if so the result contains the returned value 
+0

这是C++/CLI,所以我对这个p/invoke感到困惑。它真的需要吗? MC++很好的混合。 – leppie 2014-12-09 14:09:37

+0

@leppie问题中的标题显然是C#。问题是我承认有点混乱。 – 2014-12-09 14:10:37

+0

这就是我的想法,但标记和其余的语法看起来有点像C#一样(他的回答至少):) – leppie 2014-12-09 14:36:47