function GetSysParamEx(ParamKey:PChar):PChar;stdcall;
var
cnn:TAdoConnection;
ads:TAdoDataSet;
begin
cnn:=TADOConnection.Create(Application);
cnn.ConnectionString:= GetConnectionString;
cnn.LoginPrompt:=false;
cnn.Open;
ads:=TAdoDataSet.Create(Application);
ads.Connection:=cnn;
ads.Close;
ads.CommandText:='select * from SSysParams where ParamKey=''MaxConsumption''';
ads.Open;
if ads.RecordCount>0 then
begin
result:=PChar(ads.FieldByName('ParamValue').AsString);
end
else
result:='';
ads.Free;
cnn.Free;
end;为什么调用的时候返回值都是为空?
var
cnn:TAdoConnection;
ads:TAdoDataSet;
begin
cnn:=TADOConnection.Create(Application);
cnn.ConnectionString:= GetConnectionString;
cnn.LoginPrompt:=false;
cnn.Open;
ads:=TAdoDataSet.Create(Application);
ads.Connection:=cnn;
ads.Close;
ads.CommandText:='select * from SSysParams where ParamKey=''MaxConsumption''';
ads.Open;
if ads.RecordCount>0 then
begin
result:=PChar(ads.FieldByName('ParamValue').AsString);
end
else
result:='';
ads.Free;
cnn.Free;
end;为什么调用的时候返回值都是为空?
解决方案 »
- 如何让StringGrid不能获得焦点
- 请大家推荐这样一个控件?
- 如何在delphi程序中于服务器端的asp程序交互/?
- 这个vc声明怎么改成Delphi的?hresult sticreateinstance(hinstance hinst, dword dwver, psti *ppsti, lpunknown punkouter)
- 为何 CmdLine 接收到的参数都变小写?
- 怎样使用BDE直接连接SQL SERVER服务器
- TTreeView相关问题
- 一个算法的问题?
- 如何通过发消息的办法来取得powerBuilder中pbdw窗口的中的数据
- 高手请进
- 如何得到汉字的编码是否在GBK范围之内?
- NMftp传文件的出错处理问题
var
cnn:TAdoConnection;
ads:TAdoDataSet;
p : pchar;
begin
cnn:=TADOConnection.Create(Application);
cnn.ConnectionString:= GetConnectionString;
cnn.LoginPrompt:=false;
cnn.Open;
ads:=TAdoDataSet.Create(Application);
ads.Connection:=cnn;
ads.Close;
ads.CommandText:='select * from SSysParams where ParamKey=''MaxConsumption''';
ads.Open;
if ads.RecordCount>0 then
begin
getmem (p,length (FieldByName('ParamValue').AsString));
...//复制到P
result:=p;
end
else
result:='';
ads.Free;
cnn.Free;
end;
而是應該用 StrCopy 之類的復製,
要不然, 只是將指針簡單的指向 一版內存, 到函數結束, 那片內存(ads.FieldByName('ParamValue').AsString);) 可能已經被釋放了我一般是這樣的
function GetSysParamEx(ParamKey:PChar; const myResult: pchar):boolean;stdcall;
function GetSysParamEx(ParamKey:PChar; const myResult: pchar; const nResultSize: Integer):boolean;stdcall;提示楼主一下:myResult 的空间是在调用 GetSysParamEx 之前分配的,而不是由 GetSysParamEx 分配。——Win32 API 中凡是用了 PChar (LPCSTR) 的,几乎都是遵循这么一个原则。
string s;//Pchar to string :
s:=StrPas(p); //string to pchar :
getmem(p,length(s));
StrPCopy(p,s);
//string to pchar :
getmem(p,length(s)); // 应该是 GetMem(p, Length(s) + 1); ——字符串末尾还有个 #0.
StrPCopy(p,s);
GetMem(p, Size);
释放:
FreeMem(p, Size); 或 FreeMem(p);
还用得着操作内存吗,汗,高手就是不同..楼主用下面这个试试
ads.CursorLocation :=3;
ads.open;
把返回改为 WideString 的,或 Variant 的就可以了
以现在的计算机不会在乎这么点转换速度的function GetSysParamEx(ParamKey:PChar):WideString;stdcall;
Reslt := ads.FieldByName('ParamValue').AsString;
若真的要返回 String 要保证 String 在Dll 中不被释放,并且在主程序中不被修改才可以
一般讲来返回 const 值和 dll中的全局变量是可以的,尽量还是用 WideString
StrPCopy(p,s);
result := p;
这样写可以通过,但会不会造成内存泄漏?