bcb代码转delphi

newyj 2001-11-03 02:49:08
bcb 写的dll 中有个函数
xtern "C" __declspec(dllexport) int __stdcall GetTTSData(String TextStr,
String IPStr, String FileName,PBYTE &PCMBuffer, int Speed)
{
TTSData objTtsData;
TMemoryStream* MyStream;
int dwFileSize, nRet;

//检查PCMBuffer是否NULL
if(PCMBuffer != NULL) {
delete PCMBuffer;
PCMBuffer = NULL;
}
...
MyStream = new TMemoryStream;
MyStream->Write((void*)((int)objTtsData.pOutBuf) , objTtsData.dwOutBufSize);

dwFileSize = MyStream->Seek(0, soFromEnd);
PCMBuffer = new byte[dwFileSize];
MyStream->Seek(0, soFromBeginning);
MyStream->Read(PCMBuffer, dwFileSize);
delete MyStream;
}
}
在delphi 中调用
function GetTTSData(TextStr, IPStr, FileName:String; PCMBuffer: Pointer; Speed: integer): integer; stdcall; external 'dmtts.dll' name 'GetTTSData';

GetTTSData(TextStr, IPStr, FileName, @PCMBuffer,Speed);


我想转成delphi 的
主要我弄不清如何 表示PBYTE PBYTE &PCMBuffer
且 PCMBuffer 的内存如何分配 getmem( PCMBuffer ,size)好像不行
...全文
84 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
newyj 2001-11-03
  • 打赏
  • 举报
回复
如何实现在dll 中分配内存 和释放
///////////dll
library PrjDll;
uses
windows, SysUtils, Classes;
{$R *.RES}
function file2char(var P:Pchar):integer; stdcall;export;
var
fm:Tfilestream;
begin
//MessageBox(0, PChar(IntToHex(Longint(p), 8)), '', MB_OK);
fm:=Tfilestream.Create('1.txt',fmopenread);
result := fm.size+1;
getMem(p,fm.size+1);
//MessageBox(0, PChar(IntToHex(Longint(p), 8)), '', MB_OK);
fm.read(p,fm.size);
fm.Free;
end;
procedure delmem(p:pchar);
begin
freemem(p);
end;
exports
file2char,
delmem;
begin
end.
//测试程序

function file2char(var P:Pchar):integer; stdcall;external 'PrjDll.DLL';
procedure delmem(p:pchar); stdcall;external 'PrjDll.DLL';
var
Form1: TForm1;

implementation
var
p:pchar;
{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var

isize:integer;
begin
//getmem(p,8); //如果分配的内存比实际需要的大没问题,小了就不行;
//我想知道dll中如何去改变内存大小;好像ReallocMem不行
//p[0]:=#0;
// MessageBox(0, PChar(IntToHex(Longint(p), 8)), '', MB_OK);

isize:=file2char(p);
// MessageBox(0, PChar(IntToHex(Longint(p), 8)), '', MB_OK);

if isize>0 then
begin
richedit1.Clear;
richedit1.Lines.add(p);
end
else richedit1.Lines.add('dfadfdas');
// freemem(p,isize);
delmem(p);
p:=nil;

end;

end.
newyj 2001-11-03
  • 打赏
  • 举报
回复

我现在要用delphi 写一个dll ;就是在dll分配内存出错;
getdata(buf:pchar);
beign
getmem(buf,size);
end;
delmem(buf:pchar);
begin
freemem(buf);
end;

主程序中
var
p;pchar;

getdata(p);
delmem(p);
好像无法成功


weizhi 2001-11-03
  • 打赏
  • 举报
回复
Delphi 中定义PCMBufferkss可用:
Var
PCMBuffer : PBYTE;
分配和释放可用.
GetMem(PCMBuffer,Size);
FreeMem(PCMBuffer);

在BCB的
extern "C" __declspec(dllexport) int __stdcall GetTTSData(String TextStr,
String IPStr, String FileName,PBYTE &PCMBuffer, int Speed)

中定义的PCMBuffer参数就是一个普通的绶冲区指针,没什么特别的地方.
所以你在Delphi中只要定义一个PBYTE变量(它就是一个指针变量),然后为它分配内存即可.

5,391

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧