使用PInvoke将指针作为参数传递给本机函数

时间:2014-12-09 11:34:04

标签: .net visual-studio c++-cli pinvoke

我需要调用本机函数

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

在长*它会给我结果

我正在做这个

[DllImport("mrfw.dll", EntryPoint = "_McammGetCurrentBinning@8")]
static long Get_Current_Binning(Int32, IntPtr);

但是这个电话无效

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

long Binning = Get_Current_Binning(Camera_Index, Result_Pointer);

我有异常System.AccessViolationException 所以,功能不能把结果写给我。

怎么做?

谢谢。


更新

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

- 我正在使用c ++ cli。它不是c#

- 我需要pinvoke。我无法从cli项目中调用unmanaget dll

-i确实通过这样做找到了解决方案。你可以删除我的答案,给我一些弊端,但它是有效的。真是太糟糕了?

[DllImport("mrfw.dll", EntryPoint = "_McammGetCurrentBinning@8")]
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);
}

1 个答案:

答案 0 :(得分:1)

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

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

    在任何一种情况下,您都可以像这样调用函数:

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