不知你有没有注意Delphi的Dll调用需对String类型的特别处理,如果忽略了这点,试试这两种方法:
方法1:在Dll程序及调用该Dll的程序的项目文件的use子句的最前面加入ShareMem,发布程序时加上BORLNDMM.DLL;
方法2:改用Pchar处理,自己调用GetMem,FreeMem等函数执行相关的内存管理工作;
本人倾向于第2种方法,方便发布管理,也方便其它开发工具的调用;
方法1:在Dll程序及调用该Dll的程序的项目文件的use子句的最前面加入ShareMem,发布程序时加上BORLNDMM.DLL;
方法2:改用Pchar处理,自己调用GetMem,FreeMem等函数执行相关的内存管理工作;
本人倾向于第2种方法,方便发布管理,也方便其它开发工具的调用;
解决方案 »
- VclSkin 在TPageControl 无皮肤问题
- 字符串的提取 delphi
- 如何奖类数组作为函数或过程的参数?
- delphi原代码学习方法?
- 在程序A中点击安钮打开程序B时出错,请教!
- 写了一段把数据库文件导出为’.CSV‘格式的代码,希望大家讨论!
- 请问象office如word 能伸缩的菜单怎么实现的,象网络蚂蚁右下的grid从左到右平拖动态效果如何实现的??
- fastreport中的数据为何为'0'的就不显示.
- 关于DBGrid多行表头
- delphi 自身的Paxdox数据库问题.
- 有在浙江杭州搞DELPHI的吗?留个QQ,交流一下吧。
- select top 10 * from table。为什么不行呢?select top(10) * from table这样不行?
一般在DLL中的字符串都是用PChar形式。
pchar返回的只有一个字符,现在要是返回一个字符串呢?谢
{ OtherUnit, }ShareMem;{ 如果你的String可能包括#0字符,你必须使用Len参数 }
function MidString(S: PChar; Len: PInteger): PChar; stdcall;
var
I: Integer;
newLen: Integer;
begin
NewLen := 0;
for I := 0 to Len^-1 do
begin
if S^ = 'A' then
Inc(NewLen);
Inc(S);
end;
Len^ := NewLen;
if NewLen = 0 then
Result := nil
else
begin
GetMem(Result, NewLen);
FillMemory(Result, NewLen, 'A');
end;
end;Exports
MidString;
1. 参数是len:Pinteger,没有这个类型。我改为integer后,将程序中len^改变len
2. FillMemory函数,,使用时会出没有声明的情况。 我改为用freemem(result,newlen)后,再程序中调用,还是会出错。
FillMemory在Windows单元中。
s:string;
处理s;
result:=s;
另外可以把string 改成AnsiString 这样用C也可以调用
noall()的代码只是有一点错误,我改正后能正确执行:在Dll函数定义
function Midstring(S:string):string;stdcall;
var i:integer;
begin
for i:=0 to length(s)-1 do
begin
if s[i]='A' then
result:=result+s[i];
end;
end;
exports
midstring name 'MidString';
在应用程序中如下调用
在implementation中声明
function Midstring(S:string):string;stdcall;external 'project1.dll' name 'MidString';procedure TForm1.Button2Click(Sender: TObject);
begin
edit1.text:="CAB";
edit2.text:=midstring(edit1.text);
end;