![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Опять приведение PChar к String [D5]
Ega23 © (2005-02-07 11:30:00)Есть DLL, в ней по данному Alias'у происходит коннект к БД, возвращает password для sa:
function GetKedrPwd(var pwd:String; var ErrMess:String;
const AliasName:String='KEDR' ):Boolean;
type
TGetNewParamFunction=function(AliasName:PChar):PChar; StdCall;
var
ss:string;
GetNewParamFunction:TGetNewParamFunction;
LibHandle:THandle;
aAliasName:PChar;
p:Pchar;
begin
Result:=False;
ErrMess:='';
@GetNewParamFunction:=nil;
pwd:='';
try
LibHandle:=LoadLibrary('kedrlcd.dll');
@GetNewParamFunction:=GetProcAddress(LibHandle, 'GetNewParam');
if @GetNewParamFunction<>nil then
begin
aAliasName:=StrAlloc(Length(AliasName)+1);
aAliasName:=StrPCopy(aAliasName, AliasName);
p:=GetNewParamFunction(aAliasName);
ss:=String(p);
StrDispose(aAliasName);
end;
FreeLibrary(LibHandle);
except on E:Exception do
begin
ErrMess:=E.Message;
Exit;
end;
end;
Result:=True;
pwd:=ss;
end;
Внутри библиотеки всё отрабатывается корректно, проверял.
На ss:=String(p); происходит вылет по AV.
В чём может быть причина?
Ega23 (2005-02-07 12:15:00) [21]Что такое Result:=S;
Там кодирование-декодирование пароля происходит. S - внутренняя переменная функции function CodeIt(aStr,aKey:string):string;, раздел var и текст функции пропустил, экран засорять не стал.
Anatoly Podgoretsky (2005-02-07 12:09:00) [22]Ega23 © (07.02.05 11:30)
приведение PChar к String не возможно, структура разная, возможно только преобразование из PChar в String.
Что такое Result:= S;
Ega23 (2005-02-07 12:04:00) [23]Функция из DLL:
function GetNewParam(aAliasName:PChar):PChar; StdCall;
function CodeIt(aStr,aKey:string):string;
begin
................
Result:=S;
end;
const
stdsql='select LimitNum from dbo.paramsglb';
xkey='836519';
var
DB:TDataBase;
Qu:TQuery;
ss:string;
begin
Result:='';
try
DB:=TDataBase.Create(nil);
try
With DB do
begin
AliasName := String(aAliasName);
DatabaseName := 'BD0';
LoginPrompt:=False;
Params.Clear;
Params.Add('USER NAME=KEDR0');
Params.Add('SQLQRYMODE=SERVER');
Params.Add('PASSWORD=');
Connected:=True;
end; //With DB do
Qu:=TQuery.Create(nil);
try
With Qu do
begin
DatabaseName:=DB.DatabaseName;
RequestLive:=True;
SQL.Text:=stdsql;
Open;
if (Active) and (not IsEmpty) then
begin
ss:=Fields[0].AsString;
ss:=CodeIt(ss, xkey);
Result:=PChar(ss);
end;
end;
finally
Qu.Active:=False;
Qu.Free;
end;
finally
DB.Connected:=False;
DB.Free;
end;
except
end;
end;
//*************************************************************************************
exports
GetNewParam name 'GetNewParam';
Владислав (2005-02-07 11:50:00) [24]Покажу функцию из DLL.
Ega23 (2005-02-07 11:48:00) [25]2 Игорь Шевченко © (07.02.05 11:35) [1]
Проблема в том, что я в отладчике значения P не вижу.... :-(
Игорь Шевченко (2005-02-07 11:35:00) [26]SetString не проще ?