| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
大量收QQ微信精准粉/交友粉,非诚勿扰千里之行 始于足下
共有 4810 人关注过本帖
标题:C++写DLL,怎么接收C#返回在byte[]??求帮助
只看楼主 加入收藏
atfeel
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2006-2-20
结帖率:0
  已结贴   问题点数:10  回复次数:7   
C++写DLL,怎么接收C#返回在byte[]??求帮助
下面是C#的代码
static IntPtr sendDataFun(IntPtr buf, int len)
 {
       byte[] buffer = new byte[len];
       Marshal.Copy(buf, buffer, 0, len);
      //此处是各种处理。。省略
      
      //获取buffer字节数组的内存地址
      IntPtr pin = GCHandle.ToIntPtr(GCHandle.Alloc(buffer));
      return pin;//把内存地址返回给DLL
}




这里是C++的代码,问题就在这里
//这行前面的void* 类型可以接收C#返回字节数组指针IntPtr类型吗?
typedef void* (WINAPI *mhook_func)(char* buf, int len);//这个结构就是下面_msend函数的

int WINAPI send(const char *buf, int len)
{
    char *temp = new char[len];
    memcpy_s(temp, len, buf, len);
 
    //_msend就是C#的委托函数(sendDataFun),先将temp和len发送给C#的处理,再返回字节数组,再转成 char *
    char * aa =(char *)_msend(temp, len);//这里要怎么做才能把C#返回的IntPtr指针内容读取并转成char *
    //重点在这一部分。怎么实现我要的功能
     
    //第一个参数aa就是上面上行从C#返回的字节数组的char *
    int ret = g_trueSend(aa, len);
    delete temp;
}
搜索更多相关主题的帖子: return  
2016-01-16 11:55
天使梦魔
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:37
帖 子:564
专家分:2754
注 册:2007-8-29
  得分:10 
如果按照我的方法就不要用返回值,用参数内的void* 到时候强制转char*就ok了。
简单的说就是输出表比如是void test(void* text,int* size)//DLL查询器里查一下抛出的接口对不对
用函数指针映射它,然后先取长度就行,int是固定4字节的。注意这样做前提是注意变量生命周期,不能在内部结束

C++和C#委托是CLR代码,一种变种,我看不懂也弄不来。它有自己的机制。自己好运,不过以前做过dll给delphi用过,没有变量约定这么一说,而且每个语言变量长度也不一样,所以都是强制内存访问的。你要是觉得麻烦也可以分成两个接口,一个抛长度,一个抛内容
2016-01-16 20:28
atfeel
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2006-2-20
  得分:0 
回复 2楼 天使梦魔
可问题是DLL需要等待C#返回处理结果,往下执行。不能分开两个函数的。

2016-01-16 20:38
天使梦魔
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:37
帖 子:564
专家分:2754
注 册:2007-8-29
  得分:0 
直接抛结构指针吧,就是句柄。我估摸着这两个都应该一样的,通过查询状态变量来识别当前行为,都是些二进制,自己想想办法就有了。
别忘了把呼叫约定都统一成_stdcall
2016-01-17 08:07
atfeel
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2006-2-20
  得分:0 
回复 4楼 天使梦魔
因为是新手,C++又极其不了解。。或不是有人帮忙,都不知多久才能实现。
我现在C#已经处理好了数据包,都是以字节数组的方式存放,
就是不知道是什么方式 回传给DLL,DLL又怎么接收还原回char*

DLL 需要把C#的处理结果传给SOCKET。才能正常
2016-01-17 09:53
天使梦魔
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:37
帖 子:564
专家分:2754
注 册:2007-8-29
  得分:0 
你是不是想类似这样:
程序代码:
#include <iostream>
using namespace std;

//-----------dll--------------------
char* buffer;//DLL中的全局,加入exe后成为一部分
int ErrorNumber;

void* DllMsg(int &size)
{
    size=8;
    buffer=new char[size];
    buffer="12345678";
    return buffer;
}

void DllClose(void)//释放掉用过的buffer
{
    delete buffer;
}
//-----------exe------------------------


int _tmain(int argc, _TCHAR* argv[])
{
    int mysize;
    char* mydata=(char*)DllMsg(mysize);
    cout<<"文件长度:"<<mysize<<endl;
    cout<<"内容:";
    for(int i=0;i<mysize;i++)cout<<mydata[i];

    DllClose();
    cin.get();
    return 0;
}


DLL的输出有限,如果不愿意做参数就直接在buffer中取长度,约定好前4个字节为int,取的时候先取长度,然后取内容。和读本地文件一样像什么jpg,png,mp3等等
2016-01-17 10:46
天使梦魔
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:37
帖 子:564
专家分:2754
注 册:2007-8-29
  得分:0 
另外,如果用委托,就是CLR,完全就是本地语言写法,根本不需要去约定文件内容的。调用的时候和自己开发语言一模一样,但前提是你会用委托。
2016-01-17 10:48
atfeel
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2006-2-20
  得分:0 
可以了,感谢
2016-01-17 13:05







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032858 second(s), 9 queries.
Copyright©2004-2018, BCCN.NET, All Rights Reserved