日期:2014-05-18  浏览次数:20922 次

求教C++ 含指针DLL在.net中的引用即调用方式
原型 : int bst_transmit(void* pBuffer,int nLength,int DeviceId,int ChannelId)

  功能 : 发送卡发送数据.可以反复多次调用,建议nLength取值在20K到2M之间

  参数 : pBuffer 待发送数据缓冲区的指针;
  nLength 要发送的长度,字节单位,建议取值在20480到204800之间.
  DeviceId 发送卡编号,0开始.
  ChannelId 通道编号,从0开始

  返回值: 实际发送的数据长度,字节单位
  负数表示操作出错

------解决方案--------------------
C++ void* pBuffer
=>
C# byte[] pBuffer
------解决方案--------------------
public extern int bst_transmit(IntPtr pBuffer,int nLength,int DeviceId,int ChannelId)
------解决方案--------------------
探讨

C++转C#
pParam->file_buffer=new unsigned char[ts_size];

pParam.file_buffer=new byte[ts_size];
对吗?

------解决方案--------------------
2, 3樓的方法都可行,若仍有問題,試試
[DllImport("bst_2k.dll", EntryPoint = "bst_transmit", CharSet=CharSet.Auto, CallingConvention=CallingConvention.Cdecl)]
//Cdecl(呼叫端) or StdCall(被呼叫端)表看你要在那釋放資料
public static extern int bst_transmit(IntPtr pBuffer, int nLength, int DeviceId, int ChannelId);
當你宣告完後,正確調用bst_transmit(pBuffer, nLength, DeviceId)這樣你的bst_transmit就已經被賦值了。
------解决方案--------------------
可以先把問題簡單化,試試
string str = "hello" ;
IntPtr pBuffer = System.Runtime.InteropServices.Marshal.StringToCoTaskMemAuto(str);
res = bst_transmit(pBuffer, str.Length, 0, 0);
看看可以成功嗎?
如果這樣也不行,可能要想想bst_transmit有問題嗎?
------解决方案--------------------
IntPtr FilePort = (IntPtr)File_Sm.Read(Buff, TS_BUFFER_LENGTH*i, TS_BUFFER_LENGTH);
File_Sm.Read(....)型別是int, 試試不轉型可以嗎
int FilePort=File_Sm.Read(Buff, TS_BUFFER_LENGTH*i, TS_BUFFER_LENGTH);

如果不行,一定要轉的話,試試
bst_transmit(Covenrt.ToInt32(FilePort), str.Length, 0, 0);