edsdk c#pinvoke函数EdsCreateMemoryStream使堆栈失衡

时间:2016-08-17 21:15:15

标签: c# pinvoke calling-convention edsdk canon-sdk

我正在开发小型照片应用程序,它应该与佳能EDSDK api配合使用EOS相机。旧的dll(从2014年开始)和老式相机,佳能1100D和1200D一切都运行良好。最近我购买了型号为1300D的succesor。当然,旧的dll(2014)从2016年开始没有认出新的相机型号,我无法连接相机。

所以我更换了旧的dll: EDSDK.dll 和 EdsImage.dll

采用最新的佳能EOS实用程序ver.3,与佳能1300D配合使用。

现在,我的相机被识别出来,在我的主面板上我可以看到连接相机的名称,佳能EOS 1300D。

但在更换dll之后,当我尝试从相机启动实时视图时,我收到了这个奇怪的错误信息:

  

调用PInvoke函数   'testApp!EDSDKLib.EDSDK :: EdsCreateMemoryStream'失衡了   堆。这可能是因为托管的PInvoke签名没有   匹配非托管目标签名。检查是否正在通话   PInvoke签名的约定和参数与目标匹配   非托管签名

我将非常感谢任何帮助。我已经失去了很多时间。我不再有任何想法,我不知道在哪里寻找答案。

提前谢谢大家。

1 个答案:

答案 0 :(得分:2)

版本3.4将一些参数从uint更改为ulong。 由于您仍然使用旧的函数定义,因此问题就来自于此。 检查头文件或EDSDK附带的C#文件的区别。

我认为这些功能是您需要改变的功能:

  • EdsDownload
  • EdsCreateMemoryStream
  • EdsCreateMemoryStreamFromPointer
  • EdsRead
  • EdsWrite
  • EdsSeek
  • EdsGetPosition
  • EdsGetLength
  • EdsCopyData

另请注意,DirectoryItemInfo结构将其Size字段从uint更改为ulong。

在版本3.2中,PictureStyleDesc结构已更改。已添加uint SharpFinenessuint SharpThreshold字段。