c#调用c函数问题

heting1024 2010-04-02 03:45:07
最近在做指纹识别的时候,遇到个问题,请高手们帮帮忙
厂商提供的dll里边有个方法

extern "C" __declspec(dllimport) BOOL FPSAPI CaptureImage(BYTE uwTimeoutS,BYTE* pRawImage);

c#调用映射是这样
/// <summary>
/// 捕获图象
/// </summary>
/// <param name="uwTimeoutS">超时时间</param>
/// <param name="pRawImage">存贮图象数据</param>
/// <returns>1成功,其他失败</returns>
[DllImport("fpsiml.dll", EntryPoint = "CaptureImage", CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Unicode)]
public static extern int CaptureImage(UInt16 uwTimeoutS, byte[] pRawImage);

但是调用这个方法后,pRawImage字节数组的每一个字节都是255,我想是不是这个函数对应传的数据类型有问题。
...全文
200 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
heting1024 2010-04-23
  • 打赏
  • 举报
回复
问题解决了,但是不是传参的问题,分全给你吧。
heting1024 2010-04-06
  • 打赏
  • 举报
回复

还是不行,chenchangxiong,可不可以麻烦你把你C写的dll给我用一下。我试试。
chenchangxiong 2010-04-06
  • 打赏
  • 举报
回复
我的dll是vs自动生成的啊,用了c的导出形式(.def)导出,你要的话,留个邮箱发给你
ForestDB 2010-04-05
  • 打赏
  • 举报
回复
帮顶。
wangxing221 2010-04-04
  • 打赏
  • 举报
回复
用unsafe吧,直接用指针好了
chenchangxiong 2010-04-04
  • 打赏
  • 举报
回复

我这里这么声明
[DllImport(@"C:\Users\ccx\Documents\Visual Studio 2008\Projects\TestDll\Debug\TestDll3.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void GetInt(Byte[] data);
然后 这么调用
Byte[] bytes = new Byte[5];
GetInt(bytes);
可以正确的拿到数据
你可以试试夹CallingConverntion 强制制定是c形式的调用试试
ps: 这两天回家了
heting1024 2010-04-02
  • 打赏
  • 举报
回复
结果还是一样
heting1024 2010-04-02
  • 打赏
  • 举报
回复
我先实例化
 byte[] pRawImage =new byte[9216];

也像你那样试过IntPtr pRawImage
IntPtr bytepointer = System.Runtime.InteropServices.Marshal.UnsafeAddrOfPinnedArrayElement(pRawImage, 0);

chenchangxiong 2010-04-02
  • 打赏
  • 举报
回复
BYTE* pRawImage 这个是指针大小呢?这时非托管对象,c#貌似不会给你自动转吧
以前我遇到这种变量时,用IntPtr的
所以 你的函数可能这么定义
[DllImport("fpsiml.dll", EntryPoint = "CaptureImage", CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Unicode)]
public static extern int CaptureImage(UInt16 uwTimeoutS, IntPtr pRawImage);
ps: 这东西没搞过了 忘了
heting1024 2010-04-02
  • 打赏
  • 举报
回复
试过无用,传首字节也无用。头都大了,delphi示例传的是首字节,很正常。
柯本 2010-04-02
  • 打赏
  • 举报
回复
试试
public static extern int CaptureImage(UInt16 uwTimeoutS, ref byte[] pRawImage);
heting1024 2010-04-02
  • 打赏
  • 举报
回复
千万别沉
pengxn 2010-04-02
  • 打赏
  • 举报
回复
关注下

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧