导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
2017/12/14 4:05:39
标题:
求救~~~我用delphi写dll给其他语言调用 多线程执行下面的函数 程序崩溃了
浏览:1158
加入我的收藏
楼主:
有没用大神指点一下哪里问题啊 另外delphi开发dll给其他语言多线程调用,是不是只能用widestring 数据类型?? 我测试结果是不设置 IsMultiThread := TRUE; 只有widestring是在多线程下没问题的 麻烦各位大神指教一下 刚学delphi 很多东西还不知道 非常感谢~~ function GetTBytes(m_pBin: PByte; out len: Integer): TBytes; var Addr: Cardinal; Dbyte: TBytes; begin Addr:= Cardinal(m_pBin); //把指针转成整数 len:= PInteger(Addr + 4)^; //把长度取出来 SetLength(Dbyte, len); Move(m_pBin[8], Dbyte[0], len); Result:= Dbyte; end;
----------------------------------------------
-
作者:
2017/12/14 9:33:42
1楼:
为什么不设置啊,要设置的IsMultiThread := TRUE;
----------------------------------------------
-
作者:
2017/12/14 9:34:10
1楼:
给其他语言调用用什么tbytes? function NewBuffer(const pInBuffer: PBYTE; const cchInBufSize: Integer; out pOutBuffer: PBYTE; var pcchOutBufSize: Integer): BOOL; stdcall; begin if ((0 = cchInBufSize) or (nil = pInBuffer)) then begin pcchOutBufSize := cchInBufSize; Exit(FALSE); end else if (0 = pcchOutBufSize) then Exit(FALSE); pOutBuffer := malloc(pcchOutBufSize); if (nil = pOutBuffer) then Exit(FALSE); move(pInBufSize^, pOutBufSize^, pcchOutBufSize); Exit(TRUE); end;
----------------------------------------------
--
作者:
2017/12/14 11:33:15
2楼:
加锁就不是多线程了
----------------------------------------------
-
作者:
2017/12/14 11:34:02
3楼:
那用什么?我上面的函数是delphi内部用的,但是执行后崩溃
----------------------------------------------
-
作者:
2017/12/14 13:35:27
4楼:
没有大神知道么?
----------------------------------------------
-
作者:
2017/12/14 13:45:32
5楼:
给别的语言用,就用通用的数据类型。TBytes换成Byte指针,最好所有Byte都改成ansichar。 所有String类型都改成AnsiChar。
----------------------------------------------
-
作者:
2017/12/14 14:04:30
6楼:
用byte多线程也崩溃 我试过只有用widestring 这个没问题 现在dll我定义的数据类型都是pansichar
----------------------------------------------
-
作者:
2017/12/14 17:55:40
7楼:
我写的函数本身是线程安全的。 只要你自己保证你传入的参数安全就没问题。 当然,可能会有错误。电脑上没有delphi环境。 大概就这么个意思,自己debug一下就可以了。
----------------------------------------------
--
作者:
2017/12/14 21:32:29
8楼:
如果你用TByte即便是给其他的Delphi使用只要是DLL导出的函数,最好不要用TBytes这种生存期自管理的类型。否则会比较麻烦,需要ShareMEM这样的,或者DLL和EXE共享rtl.bpl。
----------------------------------------------
武稀松http://www.raysoftware.cn
作者:
2017/12/15 1:01:39
9楼:
现在问题是可能共享不了内存 主程序不是delphi写的 没办法接管内存 所以比较麻烦 另外请教下 不用tbytes用那种类型比较好???
----------------------------------------------
-
作者:
2017/12/15 1:02:03
10楼:
好的 我先试试 有问题在请教
----------------------------------------------
-
作者:
2017/12/15 13:00:17
11楼:
因为你上面说给DLL是给Delphi用的,所以让你那样用.如果是给其他语言的,也不要用TBytes,别的语言没有对应的类型. 可以仿照Windows的一些API的方式. bahamut8348 的方式就是正确的
----------------------------------------------
武稀松http://www.raysoftware.cn
作者:
hsj (hsj)
★☆☆☆☆
-
盒子活跃会员
2017/12/15 13:21:04
12楼:
inansipchar,inansipcharsize,outansipchar,outansipcharsize 做标准的,这些都是基础的
----------------------------------------------
qq:171833017,靖源软件http://www.dxmylove.com
作者:
hsj (hsj)
★☆☆☆☆
-
盒子活跃会员
2017/12/15 13:38:20
13楼:
procedure GetMd5String(const pin: PAnsiChar; const pinsize: integer; pout: PAnsiChar; var poutsize: integer); stdcall; 这么写其他语言都可以用,可以到我站上看硬盘序列号获取的包,就是这么干的,别的语言都能调http://www.dxmylove.com/download/jyharddisk.zip Delphi, C++Builder, C#, Visual C++, Visual Basic, Visual Basic.NET, PowerBuilder,fortran等
----------------------------------------------
qq:171833017,靖源软件http://www.dxmylove.com
作者:
2018/1/4 9:34:09
14楼:
用兼容的数据类型或者指针,不要用delphi独有的数据类型或者类作为参数
----------------------------------------------
-