Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Опять приведение PChar к String [D5]


Страницы:   1 2

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 не проще ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо