DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: 33227
今日帖子: 15
在线用户: 27
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/5/20 16:39:07
标题:
请教,windows的下的动态链接库按c++11标准模式编译的,delphi调用会报错,在不改动态链接库情况下,delphi有没有办法解决? 浏览:2708
加入我的收藏
楼主: 我试了c++builder下,把borland compiler的沟去掉后调用那个dll正常, 打上沟后不正常。

delphi上没有“borland compiler”这一项选择
----------------------------------------------
-
作者:
男 xuchuantao (暗黑天使) ★☆☆☆☆ -
普通会员
2023/5/20 17:37:56
1楼: 你把错误信息贴上来呀
----------------------------------------------
按此在新窗口浏览图片
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/5/20 18:21:28
2楼: 报内存地址错
此帖子包含附件:
PNG 图像
大小:110.7K
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/5/20 18:24:12
3楼: c++builder把经典编译器的勾去掉就好了,但delphi没有这一项
此帖子包含附件:
PNG 图像
大小:398.2K
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/5/20 18:33:15
4楼: delphi报错,c++builder把经典编译器也报错,
但c++builder把经典编译器的勾去掉就好了,delphi没有这一项
此帖子包含附件:hq200306_2023520183314.rar 大小:2.00M
----------------------------------------------
-
作者:
男 kentty (kentty) ★☆☆☆☆ -
普通会员
2023/5/20 19:17:01
5楼: Stdcall?
----------------------------------------------
-
作者:
男 1111111112 (1111111112) ▲△△△△ -
普通会员
2023/5/20 20:28:35
6楼: 哎 猜谜语  啊.
猜中了送对联吗?
----------------------------------------------
-
作者:
男 xuchuantao (暗黑天使) ★☆☆☆☆ -
普通会员
2023/5/20 20:31:29
7楼: 你把代码发上来一下,我们才能帮你看看,你发的视频太模糊了,看不清楚,也看不到代码
----------------------------------------------
按此在新窗口浏览图片
作者:
男 ksrsoft (cb168) ★☆☆☆☆ -
普通会员
2023/5/20 21:03:31
8楼: stdcall 标准模式没问题。
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/5/20 22:18:18
9楼: 1、硬件公司提供的sdk及例程,例程是vc和C#的,我用2013能编译并运行,结果是正确的,接口的函数不多就十来个。

2、我把它翻译成delphi,用delphi 11.3编译试第一个函数是初始化函数,运行后报内存错,用Dephi xe和delphi 2007编译运行不报内存错,但无法初始化。代码很简单,就一行话,vc例程的代码上写清楚是stdcall。

3、我用c++builder去试,如果选择"borland compiler"则运行和delphi一样报相同内存错误,看ide的堆栈,错的是相同的地方,如果把该勾去掉,运行正确。

4、开发包是硬件公司的,几十兆,十来个dll,我不好发上来,我估计还是硬件厂商开发工具和delphi直接不兼容,虽然看上去是dll

5、我没有dll的源码,但看了delphi ide的报错地方是启动了线程和网 络,估计与delphi安排dll的地址冲突
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/5/20 22:28:01
10楼: 我从网上查来资料,估计是 Borland 编译器和 clang 编译器有区别,不兼容

C++ Builder 的 Win32 编译器如何选择支持 C++ 11 的 clang 编译器?

默认的,C++ Builder 的 C/C++ 编译器:
 • Win32 编译器是 Borland 编译器,支持 C++ 0x 标准
 • Win64 编译器是 clang 编译器,支持 C++ 11 标准
----------------------------------------------
-
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
2023/5/20 23:05:14
11楼: 用C#包个COM的壳子,然后delphi调用C#的COM
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/5/20 23:08:21
12楼: @wk_knife 有例程不?
----------------------------------------------
-
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
2023/5/20 23:13:12
12楼: 估计还是初始化参数的问题,得试出来应该谁负责初始化。很可能是dll需要个地址,程序只传了个null。
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/5/20 23:32:20
13楼: 1、接口代码delphi的是照vc例程抄过来的,也参考对了c#例程,参数入口是一模一样,都是空值。

2、为了验证是不是编译器的问题,我做了个c++builder例程,代码是一致,只是用不用经典的编译器(borland compiler),结果把经典编译器勾去掉后,所编译的程序就正常运行。

3.我想是delphi把dll的加载的到内存的地址问题,也可能是硬件公司写软件的人为了卖硬件,把程序写死了
----------------------------------------------
-
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
2023/5/20 23:37:19
13楼: http://www.cnblogs.com/xspace/archive/2013/06/03/3115194.html
https://bbs.2ccc.com/topic.asp?topicid=566788
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/5/20 23:39:04
14楼: @wk_knife,好的,谢谢
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/5/21 10:40:48
15楼: 1、c#下随便新建个winForm工程,调用该函数都正常。

2、相同的类,封装给delphi就是不行,为了验证该类是否能给delphi使用,我在该类做了两个测试函数,一个加,一个减,这两方法都运行正确,但一运行到那个初始化函数就是报错。
----------------------------------------------
-
作者:
男 1111111112 (1111111112) ▲△△△△ -
普通会员
2023/5/21 11:07:08
16楼: 哦猜出来了
delphi 这边构造的 内存地址
在c++那边访问越界了?所以地址是x04很小,

太难了承上启下的基本信息太少了.
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/5/21 11:18:18
17楼: ide跳出调试窗口
此帖子包含附件:
PNG 图像
大小:172.4K
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/5/21 11:22:10
18楼: //我封装c#测试的类,这个类加减函数(jia,jian)都可以
//int Jia(int a, int b);  //delphi测试正确
//int Jian(int a, int b); //delphi测试正确
//int init_context();   //delphi调用这个报错,但我随便建个c#的winform工程调用正常

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using irisface_sdk_demo_winform;

namespace ClassLibrary1
{
    public interface IMyFunc
    {
        int Jia(int a, int b);
        int Jian(int a, int b);
        int init_context();
    }

    [ClassInterface(ClassInterfaceType.None)]

    public class Class1 : IMyFunc
    {
        public int Jia(int a, int b)
        {
          return (a + b);
        }

        public int Jian(int a, int b)
        {
          return (a - b);
        }

        public int init_context() {
          return IrisFaceSdk.ecfcir_init_context(null, null, null);
        }
    }
}
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/5/21 11:46:06
19楼: @1111111112,相同代码,c++builder不用经典编译器就正常了

就这么一句话

 public int init_context() {
          return IrisFaceSdk.ecfcir_init_context(null, null, null);
        }
----------------------------------------------
-
作者:
男 1111111112 (1111111112) ▲△△△△ -
普通会员
2023/5/21 12:27:26
20楼: 建议看汇编
c++builder 做了什么
delphi做了什么
我觉得还是 null, null, null 这里有问题最好传值.
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/5/21 13:08:50
21楼: 参数 null, null, null 没问题,vc,c#,bcb的例程都正常,就delphi调用不正常,bcb用经典模式也不正常,封装c#类给delphi调用也不正常
----------------------------------------------
-
作者:
男 lsuper (lsuper) ★☆☆☆☆ -
盒子活跃会员
2023/5/21 14:52:46
22楼: 没看到例子,盲猜下:

1、调用规范不统一,楼上说的 std、cdecl 等;可以让 ChatGPT 或大神的 Chet.exe 帮忙处理翻译 .h
2、Microsoft 浮点异常,需要提前的 Set8087CW(MCW_EM) 处理下;
3、如果怀疑内存问题,可以替换 Delphi MM 为 msvcrt 的试试(网上有 msvcrtMM.pas)
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/5/21 15:07:17
23楼: 这一句是厂商提供的c#的接口       

// 初始化
[DllImport("ec_faceiris_sdk.dll", EntryPoint = "ecfcir_init_context", ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
public extern static int ecfcir_init_context(string work_path, string sn, string server);

//c#例程调用,运行正常
private void init_Click(object sender, EventArgs e)
{
   int ret = IrisFaceSdk.ecfcir_init_context(null, null, null);
    textBox_returnValue.Text = "init=" + ret.ToString();
}



//翻译成delphi,执行异常
const
  YS_SDK = 'ec_faceiris_sdk.dll';
function ecfcir_init_context(const work_path: pansichar; const sn: pansichar; const server: pansichar): integer;
stdcall; external YS_SDK;
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/5/21 15:19:13
24楼: 18楼,我把c#的类封装成com给delphi调用,报的错与翻译成delphi函数的错是一模一样,调试信息的asm都一样的错。

但c#,vc,bcb(非经典编译器)编译的程序运行就不报错
----------------------------------------------
-
作者:
男 1111111112 (1111111112) ▲△△△△ -
普通会员
2023/5/21 15:44:26
25楼: 所以默认接口是C#的dll?
如果是 就听 11楼的吧
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/5/21 16:14:32
26楼: 1、是dll,厂商提供sdk,有vc,c#例程,我试了vc,c#,bcb(非经典编译器)都正常,就delphi不正常

2、18楼就是把c#类封装成com给delphi,依然不正常,所报的错误就是一个地方,我猜是连到厂商芯片验证程序,算了,应该是厂商把程序写死
----------------------------------------------
-
作者:
男 1111111112 (1111111112) ▲△△△△ -
普通会员
2023/5/21 19:52:08
27楼: 建议看汇编
c++ or cb 做了什么
delphi没有做了什么

std::string  之前论坛有个帖子 有人构造伪装了基本结构体,c++通过了基本测试.
----------------------------------------------
-
作者:
男 2cc (2cc) ▲▲△△△ -
普通会员
2023/5/21 20:40:07
28楼: DLL中一个对象或者结构未初始化,所以导致错误。
此帖子包含附件:
JPEG 图像
大小:18.7K
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/5/22 10:45:51
29楼: 谢谢,应该是dll的问题,估计是他们故意弄成这样
----------------------------------------------
-
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
2023/5/22 13:59:24
30楼: 1.PAnsiChar换成PWideChar
2.用PChar('')
3.用delphi7
来回换着试试吧。
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2023/5/22 14:09:56
31楼: 看了 23 楼。
C 的 string 不是类,是基础类型,是字节数组。
也就是 凡是 C 的 string 要改成  TBytes  爱信不信。

如果非要 P什么什么CHAR。
也是可以的。

关键点。
谁建立的内存,谁销毁。

其他人只能使用 内存。
内存的使用者,不能越界。

如果 你建立了内存,其他人用的时候,出现错误。

那是 你 给其他人的方式 和他想要的不一样。

比如 他觉得 是 某某CHAR 数组,你给的不是数组 是 指针。

这种情况。

就可能出现 越界错误。


但是 C# 的 string 他是一个类,不是基础类型。
不知道 DLL 是不是要求你传入一个 C# 的 string 呢?
这个我就不知道了。



如果你做 COM。
COM 的接口 OleString 是 DELPHI 的说法。
到了其他语言,可能是其他名字
反正 COM 的字符串 互相调用的时候,兼容性好。

但是 你 OleString 要给 DLL 用的时候。
还是要转换成 DLL 要求的格式。
不知道 你 COM 是不是写错了。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/5/22 14:18:43
32楼: 谢谢大家,是给过来的接口的问题,我想应该他们故意搞的,不是delphi的问题,害我浪费周末两天,现在他们改成另一个模式,在vs或delphi的调试环境下执行程序就闪退,脱离ide就正常了。

不好意思浪费了大家时间。
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/5/22 14:21:19
33楼: 谢谢,wang_80919 (Flying Wang),com是通的,是正确的。之前翻译成delphi的函数也是对的,是提供的dll故意弄成这样的

现在无论是c++builder或delphi调用,包括封装成com调用都是对的

//delphi调用
procedure TForm4.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  i := ecfcir_init_context('', nil, nil);
  ListBox1.Items.Add(i.ToString);
end;

//c++builder
void __fastcall TForm4::Button6Click(TObject* Sender)
{
    int ret = m_sdk_helper.ecfcir_init_context("", NULL, NULL);

    Button6->Caption = ret;
}

//delphi com 调用
procedure TForm4.Button2Click(Sender: TObject);
begin
  Caption := Class11.init_context.ToString;
end;
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/5/22 14:28:27
34楼: 不好意思,浪费大家时间。没有源码没真相。

开始,vc++,c#及c++builder(非经典)模式编译并调试正常,以为是delphi或bcb的问题,误导了我,我误导大家
----------------------------------------------
-
作者:
男 taday (taday) ★☆☆☆☆ -
普通会员
2023/5/23 17:57:06
35楼: 有可能问一下厂商吗?
他们修改了什么 Delphi 才可以用的?

谢谢
----------------------------------------------
-
作者:
男 wr960204 (武稀松) ★☆☆☆☆ -
盒子活跃会员
2023/5/23 19:12:13
36楼: 应该是加入了反调试功能,在IDE中运行是调试状态的。所以无法运行。
----------------------------------------------
武稀松http://www.raysoftware.cn
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/5/23 19:27:20
37楼: 算了,没精力去折腾了,现在delphi,bcb,vs的ide里运行,程序就闪退,脱离ide是好的
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行97.65625毫秒 RSS