最近做U800电话的二次开发,需要调用厂商的C函数库来打电话,后来想加入通话录音功能,但发现程序默认生产的WAV文件过大,又找了个WAV转MP3的C++函数库程序,出了点问题。下面是转MP3的程序接口(头文件):

#ifndef _MP3ENC_H_
#define _MP3ENC_H_ int mp3_enc(const char* inWavName,int nRate,const char* outMP3Name); #endif

按照C#调用非托管程序的约定,声明一个对应的C#函数接口:

 [DllImport("mp3enc.dll", CharSet = CharSet.Ansi)]
public static extern int mp3_enc(string inWavName, int nRate, string outMP3Name);

然后这样调用改函数:

 mp3_enc(txtWavFile.Text, , "222.mp3");

结果出现这样的异常信息:

 对 PInvoke 函数“U800Test!U800Test.Form1::mp3_enc”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。

跟原来调用C函数库的方法仔细对比,发现没有区别,而C函数代码却可以正常使用:
打电话的C函数接口:

USBDLL_API int _stdcall StartDial(int iDevIdx,const char* szDest);    //发送拨号命令

对应的C#函数接口:

  [DllImport("UsbDll.dll", CharSet = CharSet.Ansi)]
public static extern int StartDial(int iDevIdx,string szDest);

再看看C++的调用函数的错误信息,难道是C++字符串类型不一致?需要C++使用Unicode 字符?于是将C#的函数接口改成:

 [DllImport("mp3enc.dll", CharSet = CharSet.Unicode)]
public static extern int mp3_enc(string inWavName, int nRate, string outMP3Name);

结果C#程序直接崩溃,连Try....Catch.... 都没用。

最后,在网上搜索了半天,发现有这个说法:

DllImport还有一个CallingConvention的属性,默认值是CallingCovention.Stdcall,  此处更改成Cdecl(c/c++默认调用方式)就可以了。VS2010下必须得指定这个属性才能运行, 同样的代码在VS2008下却不存在这样的问题, 奇怪 ...

正确的C++ 函数C#调用接口应该是这样:

[DllImport("mp3enc.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int mp3_enc(string inWavName, int nRate, string outMP3Name);

最新文章

  1. Fxx and game
  2. 记一次ckeditor上传图片到服务器问题
  3. Oracle创建用户并赋予权限
  4. Android Animation初识
  5. Linux on Power 上的调试工具和技术
  6. jvm参数设置
  7. poj 3104 二分
  8. 01-编写CMS注意事项
  9. react+react-router+react-redux+nodejs+mongodb项目
  10. TabLayout:另一种Tab的实现方式
  11. 程序员奇谈之我写的程序不可能有bug篇
  12. ve2.0 v-for循环报错的解决方案
  13. WindowsService调用API
  14. python基础——2、python应用(随机、异常)——(YZ)
  15. ASP.NET Boilerplate 学习
  16. js和JQuery区别
  17. 基础知识之nginx重写规则
  18. FactoryMethod工厂方法模式(创建型模式)
  19. error C2998:不能是模板定义的错误解决
  20. org.postgresql.util.PSQLException: 栏位索引超过许可范围:3,栏位数:2。

热门文章

  1. No compatible targets were found.Do you wish to...的解决方案。
  2. Android入门(十一)SQLite CURD
  3. Huge Page 是否是拯救性能的万能良药?
  4. ASP.NET和IIS工作原理
  5. [Node.js] Node.js中的流
  6. Lining.js - 为CSS提供 ::nth-Line 选择器功能
  7. 第21/24周 性能监控(PAL工具)
  8. Design Pattern: Not Just Mixin Pattern
  9. Architecture Pattern: Publish-subscribe Pattern
  10. ROS 多台电脑间进行通信