• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

C++ 转 C#

一石十五鸟 2020-12-02 05:16:49
int SavePicToMemory(
unsigned DeviceID ,
char* cFrontImgBuf ,
char* cRearImgBuf ,
int* iFrontLen ,
int* iRearLen )
参数说明:
DeviceID:[输入] USB设备内部ID号,取值范围0-16。
cFrontImgBuf:[输出] 保存正面图像数据信息指针,不能为空。
cRearImgBuf:[输出] 保存反面图像数据信息指针,不能为空。
iFrontLen:[输出] 正面图像数据长度。
iRearLen:[输出] 反面图像数据长度。

跪求高手 帮忙转成C#的代码!!!
...全文
2209 1 收藏 77
写回复
77 条回复
切换为时间正序
请发表友善的回复…
发表回复
引用 1 楼 wanghui0380的回复:
int SavePicToMemory( uint DeviceID , ref intptr cFrontImgBuf , ref intptr cRearImgBuf , ref int iFrontLen , ref int iRearLen )
拉出去的还要吃回去?
回复
引用 76 楼 wanghui0380的回复:
[quote=引用 75 楼 真相重于对错 的回复:]拿出你的代码 [quote=引用 74 楼 wanghui0380 的回复:]
引用
这是我的问题吗?这是dll设计的问题。不知道什么叫第三方吗?世界的一切都是由你掌握的吗?你想干吗就干嘛?啥都给你准备好?你太自恋了吧?
对,都是我的错,都是dll设计的错,我太自恋,我承认行了把 对,这就是我,我都承认这是我的错,不是dll设计的问题,不是第3方的错,世界不是我说了算,ok把。反正我不会认为都是别人的错滴
[/quote] 不必,谢谢。 就像你的名字,而我们的路子“逻辑大于代码“,逻辑都原不上,别谈代码。 在说谁主张,谁举证。 这里我们没有主张任何东西,从头到尾就你一个人主张,所以你给证据,我们只能说你 给的证据有瑕疵,不能做为论据。 第一回复就告诉你,你所谓的证据都一个毛病,论据不足。当然就是那种(我不说了,免得你说俺们攻击你,话说这里谁攻击谁还真难说)纠结一点,其他忽略(无所谓,其他的都无所谓,反正其他的问题都是别人的错误) 至于我们,你证据无瑕疵了,能园了你自己2次调用那个逻辑,就ok了[/quote] 你说说话是否是放屁,谁说的用一个ref intptr获得?而我是反对你的说法。
回复
wanghui0380 2020-12-04
引用 75 楼 真相重于对错 的回复:
拿出你的代码 [quote=引用 74 楼 wanghui0380 的回复:]
引用
这是我的问题吗?这是dll设计的问题。不知道什么叫第三方吗?世界的一切都是由你掌握的吗?你想干吗就干嘛?啥都给你准备好?你太自恋了吧?
对,都是我的错,都是dll设计的错,我太自恋,我承认行了把 对,这就是我,我都承认这是我的错,不是dll设计的问题,不是第3方的错,世界不是我说了算,ok把。反正我不会认为都是别人的错滴
[/quote] 不必,谢谢。 就像你的名字,而我们的路子“逻辑大于代码“,逻辑都原不上,别谈代码。 在说谁主张,谁举证。 这里我们没有主张任何东西,从头到尾就你一个人主张,所以你给证据,我们只能说你 给的证据有瑕疵,不能做为论据。 第一回复就告诉你,你所谓的证据都一个毛病,论据不足。当然就是那种(我不说了,免得你说俺们攻击你,话说这里谁攻击谁还真难说)纠结一点,其他忽略(无所谓,其他的都无所谓,反正其他的问题都是别人的错误) 至于我们,你证据无瑕疵了,能园了你自己2次调用那个逻辑,就ok了
回复
拿出你的代码
引用 74 楼 wanghui0380 的回复:
引用
这是我的问题吗?这是dll设计的问题。不知道什么叫第三方吗?世界的一切都是由你掌握的吗?你想干吗就干嘛?啥都给你准备好?你太自恋了吧?
对,都是我的错,都是dll设计的错,我太自恋,我承认行了把 对,这就是我,我都承认这是我的错,不是dll设计的问题,不是第3方的错,世界不是我说了算,ok把。反正我不会认为都是别人的错滴
回复
wanghui0380 2020-12-04
引用
这是我的问题吗?这是dll设计的问题。不知道什么叫第三方吗?世界的一切都是由你掌握的吗?你想干吗就干嘛?啥都给你准备好?你太自恋了吧?
对,都是我的错,都是dll设计的错,我太自恋,我承认行了把 对,这就是我,我都承认这是我的错,不是dll设计的问题,不是第3方的错,世界不是我说了算,ok把。反正我不会认为都是别人的错滴
回复
wanghui0380 2020-12-04
实际上在没有h头,函数原型,已经文档不清不楚情况,我们并不猜测人家怎么写 只需要简单证明 1.zero看他变还是不变指针,他有权力变,但变不变看人家的想法,我们不猜测 2.初始1字节,看他给你报是否溢出越界。这个就是你所谓的不变,这个看程序员写法,而不是说微软不能,只是那个程序员那么写,比如他一个内存copy,一个直接数组内容赋值。 所以,我们不需要拿出什么东西。因为人家的写法确定你要证明啥 比如你楼上的写法,说我就不改指针,那么我们说你不改不改呗,你有这个权利改或不改。
回复
wanghui0380 2020-12-04
引用 66 楼 真相重于对错 的回复:
我已经给出了不止一段代码来论证我的见解。你倒是拿出个代码来啊?啥都没有在这狗撩帘子全靠嘴? 你说用zero可以,那我只好在次打你的脸啦 dll代码:
void APIENTRY func(char* buffer) {
    buffer = new char[1024];
    //strcpy(buffer, "hello world");
    // memset(buffer, 'a', sizeof(char) * 1024);
    
    //  strcpy(buffer, "hello world");
}
调用代码
[DllImport("MyDll", CallingConvention = CallingConvention.Winapi)]
        public extern static void func(ref IntPtr sb);
        static void Main(string[] args)
        {
           // Console.Read();
            StringBuilder sb=new StringBuilder(100);
            IntPtr p = IntPtr.Zero;
            func(ref p);

        }
    }
运行结果图:
你重复贴这图,你想证明啥?证明你会写C++,还是你是死不认账。请你还是解释你那个2次调用吧 已经告诉你,char* 只是一个指针,而且没有限定,他不是常量,指针可变,内容可变。你变指针了么?? 都是程序员,你非要这么搞,你的老板不扣工资么,反正我就是对的,你们说啥你都是对的 作为程序员 if zero 重新分配内存和指针有问题么 if length<我计算出的内存 重新分配 copy内存 请问,你平时写代码不是这么写么,这有毛病??如果你觉着这样不正常,我的说,你平时写的代码,我很难想象是啥,至少我很难想想2次调用这东西是个正常写法的程序写的
回复
拿不出证据,又在哪里瞎BB,算了,我是不打算回复了。
回复
引用 64 楼 wanghui0380 的回复:
[quote=引用 63 楼 真相重于对错 的回复:]别扯什么珍惜内存,又是什么内存爆掉,我只是就事论事,楼主题目是dll的导出函数,有个回传的参数,参数的形式是一个一级指针,如何处理才能把数据传回调用方。而且题目里面也没说明要多少内存,你怎么办?ref intptr,可不可以?stringbuilder不初始化足够的大小,可不可以? 在dll内部开辟一个内存,回不回的到.net的程序里?请回答?
1.第一次回复已经明确告诉你可以,你自己用zero也证明可以 2.纠结个鬼,你回复俺懒得理你。真想纠结,你纠结一下你自己的代码,我们并不像你非要弄个你死我活,你自己清楚就好。非要弄个不好意思。我们就说你自己解释“2次调用到底何解”,是正常方式?你如何解决实时性数据,两次不同?你要初始化,你如何解决不知道大小的问题?? 貌似全世界程序员,无论微软,还是C++标准委员会都没你聪明,这问题他们可不见是不是?所有c+的都调两次?所有微软的人都给个初始化。 ps:最近某plc大厂出现了“溢出式漏洞攻击”,请问这有什么意思?你初始化的我内部大小不同哦,无所谓嘛,调2次呗,扔掉数据呗。有啥所谓[/quote] 不要把你当成全世界的程序员,别人早就知道这些问题了。只是你不知道
引用 68 楼 wanghui0380 的回复:
只要你能自圆其说解释自己的问题,你就赢了。你想办法给自己圆吧 实时数据,2次调用。第一次200字节,第2次300字节,这没有疑问对不对 ok,ok 第2次初始200,解释一下。你现在收到了什么? 还是200?那么兄弟,你丢数据了,你的程序没挂,你的程序没出现数据丢失,我很好奇 收到300??那么兄弟,你这300怎么收到的,你不是说不能返回么?那他怎么出来的,这么神奇么?
这是我的问题吗?这是dll设计的问题。不知道什么叫第三方吗?世界的一切都是由你掌握的吗?你想干吗就干嘛?啥都给你准备好?你太自恋了吧?
回复
wanghui0380 2020-12-04
不用拿出证明,谁主张谁举证。 你自己说,你2次调用,很正常。当然你自己园上
回复
wanghui0380 2020-12-04
只要你能自圆其说解释自己的问题,你就赢了。你想办法给自己圆吧 实时数据,2次调用。第一次200字节,第2次300字节,这没有疑问对不对 ok,ok 第2次初始200,解释一下。你现在收到了什么? 还是200?那么兄弟,你丢数据了,你的程序没挂,你的程序没出现数据丢失,我很好奇 收到300??那么兄弟,你这300怎么收到的,你不是说不能返回么?那他怎么出来的,这么神奇么?
回复
引用 64 楼 wanghui0380 的回复:
[quote=引用 63 楼 真相重于对错 的回复:]别扯什么珍惜内存,又是什么内存爆掉,我只是就事论事,楼主题目是dll的导出函数,有个回传的参数,参数的形式是一个一级指针,如何处理才能把数据传回调用方。而且题目里面也没说明要多少内存,你怎么办?ref intptr,可不可以?stringbuilder不初始化足够的大小,可不可以? 在dll内部开辟一个内存,回不回的到.net的程序里?请回答?
1.第一次回复已经明确告诉你可以,你自己用zero也证明可以 2.纠结个鬼,你回复俺懒得理你。真想纠结,你纠结一下你自己的代码,我们并不像你非要弄个你死我活,你自己清楚就好。非要弄个不好意思。我们就说你自己解释“2次调用到底何解”,是正常方式?你如何解决实时性数据,两次不同?你要初始化,你如何解决不知道大小的问题?? 貌似全世界程序员,无论微软,还是C++标准委员会都没你聪明,这问题他们可不见是不是?所有c+的都调两次?所有微软的人都给个初始化。 ps:最近某plc大厂出现了“溢出式漏洞攻击”,请问这有什么意思?你初始化的我内部大小不同哦,无所谓嘛,调2次呗,扔掉数据呗。有啥所谓[/quote] 请不要仅靠嘴,拿出你的证明。
回复
我已经给出了不止一段代码来论证我的见解。你倒是拿出个代码来啊?啥都没有在这狗撩帘子全靠嘴? 你说用zero可以,那我只好在次打你的脸啦 dll代码:
void APIENTRY func(char* buffer) {
    buffer = new char[1024];
    //strcpy(buffer, "hello world");
    // memset(buffer, 'a', sizeof(char) * 1024);
    
    //  strcpy(buffer, "hello world");
}
调用代码
[DllImport("MyDll", CallingConvention = CallingConvention.Winapi)]
        public extern static void func(ref IntPtr sb);
        static void Main(string[] args)
        {
           // Console.Read();
            StringBuilder sb=new StringBuilder(100);
            IntPtr p = IntPtr.Zero;
            func(ref p);

        }
    }
运行结果图:
回复
wanghui0380 2020-12-04
人家是个结构体,凭啥不能返回 纠结到死的你。啥子*p,**p 嘿嘿,我真很难想象你写了这么多年代码以后,居然越写越抽抽 解释一下,亲。 char* 我可以不可以这样封送 struct { int xxx } 你以为c++到底是啥啊,一个指针又到底是啥啊,一个指针的指针右是啥,一个地址,你可以传地址过去,人家可以传地址过来,你很惊讶么?微软说,我能传地址给你,不须你传递地址过来?是微软强势,还是微软傻??
回复
wanghui0380 2020-12-04
引用 63 楼 真相重于对错 的回复:
别扯什么珍惜内存,又是什么内存爆掉,我只是就事论事,楼主题目是dll的导出函数,有个回传的参数,参数的形式是一个一级指针,如何处理才能把数据传回调用方。而且题目里面也没说明要多少内存,你怎么办?ref intptr,可不可以?stringbuilder不初始化足够的大小,可不可以? 在dll内部开辟一个内存,回不回的到.net的程序里?请回答?
1.第一次回复已经明确告诉你可以,你自己用zero也证明可以 2.纠结个鬼,你回复俺懒得理你。真想纠结,你纠结一下你自己的代码,我们并不像你非要弄个你死我活,你自己清楚就好。非要弄个不好意思。我们就说你自己解释“2次调用到底何解”,是正常方式?你如何解决实时性数据,两次不同?你要初始化,你如何解决不知道大小的问题?? 貌似全世界程序员,无论微软,还是C++标准委员会都没你聪明,这问题他们可不见是不是?所有c+的都调两次?所有微软的人都给个初始化。 ps:最近某plc大厂出现了“溢出式漏洞攻击”,请问这有什么意思?你初始化的我内部大小不同哦,无所谓嘛,调2次呗,扔掉数据呗。有啥所谓
回复
别扯什么珍惜内存,又是什么内存爆掉,我只是就事论事,楼主题目是dll的导出函数,有个回传的参数,参数的形式是一个一级指针,如何处理才能把数据传回调用方。而且题目里面也没说明要多少内存,你怎么办?ref intptr,可不可以?stringbuilder不初始化足够的大小,可不可以? 在dll内部开辟一个内存,回不回的到.net的程序里?请回答?
回复
引用 61 楼 wanghui0380 的回复:
玩c的几个字节都纠结,还不说。你平白无故多给他了几百k不用的字节 这玩意之所以当年c函数的会出现这种形式的api定义,原意就是内部不定长,外部只给空。内部告诉你在那里,取多少,避免外部无端多给字节。 C的人,比你珍惜内存的。那不是个问题,反正对你来说多几十k好大回事哦,了不起内存爆掉,了不起重启服务器
你的意思是:.net 调用非托管的dll,dll函授需要一个char*参数,如果传入一个stringbuilder 给dll ,无论这个stringbuilder怎么初始化,进入到dll中,它都会被自动调整为dll要求的字节数量,是吗?
回复
说起c/c++,可能你不熟悉,那么我举个c#的例子 void fun(string str) { str="123"; } ... string str="hello world"; fun(str); //这里str等于多少?
回复
说白了,c++ 一级指针做参数不能,不能把参数指向的地址改变,要改变必须是二级指针 当然你说, 你能去看看,海康,大华怎么用么? 海康告诉你,给我intptr.zero,我还给你 指针 12345678 地址,所以你论据失效 两个可能一个是那个函数的参数是二级指针,所以可以用ref intptr ,一个是双方协商好,我就往一个固定的地方写入数据,那可以是char* ,或者是intptr
回复
引用 14 楼 wanghui0380 的回复:
1.我能告诉你,无论那个C++都有大量类似api,比如海康,比如大华的api 你能去看看,海康,大华怎么用么? 海康告诉你,给我intptr.zero,我还给你 指针 12345678 地址,所以你论据失效 2.你说winapi,ok,没问题。 来告诉我,你怎么解释在pinvoke这个全世界人们用的站里的winapi,为啥有那么多的ref intptr http://www.pinvoke.net/search.aspx?search=ref%20intptr&namespace=[All]
1、那样当然可以,但是首先要求dll函数的参数是二级指针。二级指针才能用ref intptr绑定 2、你看看那些用ref intptr的是什么?举个你说的例子 [DllImport(“ kernel32.dll”)] extern static bool BackupRead(IntPtr hFile,IntPtr lpBuffer, uint nNumberOfBytesToRead,uint lpNumberOfBytesRead,bool bAbort, bool bProcessSecurity,ref IntPtr lpContext); 那么他的函数原型是什么? C ++ 复制 BOOL BackupRead( HANDLE hFile, LPBYTE lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, BOOL bAbort, BOOL bProcessSecurity, LPVOID *lpContext ); lpContext 注意到没有LPVOID 是void* 看看msdn就知道了,lpContext其实是void** 如果说因为msdn里大量的ref intptr,因此就说这个intptr,你逻辑混乱了吧? 3、我没搞过相机,因此你说我只能请教一下,如果连续两次函数调用竟然要花费秒一级的时间,是不是这个函数该优化啦?
回复
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2020-12-02 05:16
社区公告

让您成为最强悍的C#开发者