小弟在DLL里声明了个记录类型如下:type
Component = Record
PartNum : Pchar;
Ver : Pchar;
Des : Pchar;
SUPBy : Pchar;
FileName : Pchar;
Size : Int64;
Created : TDateTime;
Modified : TDateTime;
end;用该记录类型作为A函数的返回值给主程序,在主程序里也同样定义了一样的记录类型,可是在调用DLL里的A函数后,发现PartNum的值不对,后面出现乱码,我想应该是内存读写问题,但不知道该如何处理,请高手赐教!PS: A函数是用stdcall.
Component = Record
PartNum : Pchar;
Ver : Pchar;
Des : Pchar;
SUPBy : Pchar;
FileName : Pchar;
Size : Int64;
Created : TDateTime;
Modified : TDateTime;
end;用该记录类型作为A函数的返回值给主程序,在主程序里也同样定义了一样的记录类型,可是在调用DLL里的A函数后,发现PartNum的值不对,后面出现乱码,我想应该是内存读写问题,但不知道该如何处理,请高手赐教!PS: A函数是用stdcall.
解决方案 »
- DELPHI记录集结构以流的方式文字+图片写入自定义库
- 我见人的软件有,也上CSDN问过,但是还是没有答案。
- [在线等]求教random()和Randomize;的用法
- 100分 求 数据库 整入散出关联计算的设计方法
- ,在线等待,关于 tclientdataset 和 tdcomconnection1 的连接的问题
- 王八蛋 居然倒分
- 非常奇怪的问题,大家近来帮忙看一看...在线侯...
- 开始我们的Win32 SDK/API程序设计吧!
- 并口中控制的中断问题。
- 如何得知FlatListBox里是否选中了,选中了什么?急……!!!!!
- delphi调用vc开发的dll的问题
- 专门针对孩子戒掉网瘾的代码!
2、调用协定不一致,两边都是stdcall?有没漏写?
建议直接返回一个json字符
1。没有调用GETMEN,直接赋值的。
2。调用协定都一直的,没有错。
DLL 和调用部分的都贴出来
PChar 是个指针, 你得分配内存.
那如果在DLL里用StrAlloc分配内存的话,在哪里释放呢?主程序吗?
StrAlloc 雖然最終也是調用了 GetMem, 但 StrAlloc 會在指標前面添加 Delphi 需要的 4 個管理位元組(記錄長度).
StrAlloc 分配的記憶體, 用 StrDiose 釋放, 用 StrBufSize 獲取大小.
用 FreeMem 釋放可以嗎? 這樣會少釋放 4 個位元組.
這種類型的指標一般用於 API 函數的參數, 譬如獲取窗口標題:var
p: PChar;
begin
p := StrAlloc(256);
GetWindowText(Handle, p, StrBufSize(p));
ShowMeage(p); {Form1}
StrDiose(p);
end; StrAlloc 根據不同的參數(PWideChar、PAiChar)分別重載調用了 WideStrAlloc、AiStrAlloc, 所以我們也可以直接使用這兩個函數(這也需要用 StrDiose 釋放), 不過使用它們的必要性不大; 用 StrAlloc 指定好參數類型即可.
給字元指標分配記憶體其他方法也挺方便, 譬如://獲取 WINDOWS 所在目錄
var
buf: array[0..MAX_PATH] of Char;
begin
GetWindowsDirectory(buf, Length(buf));
ShowMeage(buf); {C:WINDOWS}