Вниз
Скачать: CL | DM;

COM клиент на Delphi. Правильно ли я делаю?   Найти похожие ветки 

 
awaken   (2002-07-15 07:55) [0]

1.Нужно ли в Delphi вызывать CoInitialize/CoUninitialize,
а также AddRef и Release? вроде бы я читал что она делает это
автоматически

2.При запуске проги из-под Delphi IDE происходит крэш после
закрытия формы. похоже из-за CoUninitialize;
при запуске под виндами все ОК

3.Как преобразовать данные возвращаемые в BSTR (в Delphi -
WideString) в нормальный читаемый вид?
эта тестовая прога делает расшифровку паролей, вызывая
COM-объект написанный на C++. при приведении WideString к
String часть символов коверкается и отображается как ?


procedure TSecureTest.EncryptBtnClick(Sender: TObject);
var
lKey, len, i: integer;
Src, Res, SHex: WideString;
pCrypt: ICryptoAPI;
begin
OleCheck(pUnk.QueryInterface(ICryptoAPI,pCrypt));
pCrypt._AddRef;
lKey := StrToInt(Key.Text);
Src:= SrcPwd.Text;
Res:="";
// Encrypt password using key generated by GetKey()
OleCheck(pCrypt.Encrypt(Src, lKey, Res));
pCrypt._Release;
EncPwd.Text := Res;
len := Length(Res);
SHex := "";
// Show binary as Hex
for i:=1 to len do
SHex := SHex + Format("%02x",[ord(Res[i])]);
EncPwdHex.Text := SHex;
end;

procedure TSecureTest.DecryptClick(Sender: TObject);
var
lKey: integer;
Res, DcrPwd: WideString;
pCrypt: ICryptoAPI;
begin
OleCheck(pUnk.QueryInterface(ICryptoAPI,pCrypt));
pCrypt._AddRef;
lKey := StrToInt(Key.Text);
Res := EncPwd.Text;
pCrypt.Decrypt(Res, lKey, DcrPwd);
pCrypt._Release;
// After decryption password FUCKED UP!
DecrPwd.Text:=DcrPwd;
end;

procedure TSecureTest.FormCreate(Sender: TObject);
begin
CoInitialize(nil);
// Create as out-of-process server
OleCheck(CoCreateInstance(CLASS_CoCryptoAgent, nil,
CLSCTX_LOCAL_SERVER, IUnknown, pUnk));
end;

procedure TSecureTest.FormClose(Sender: TObject; var Action: TCloseAction);
begin
pUnk._Release;
CoUninitialize;
end;


 
Romkin ©   (2002-07-15 10:28) [1]

1. Не надо. CoInitialize вызывается в Application.Initialize при использовании COM (если в проекте используется ComObj). Исключение - если создаешь поток, тогда ручками. AddRef & Release Вызываются тоже автоматически, для типа interface
2. Не всречал...
3. при присвоении WideString типу string все приводится автоматически, (обратно - тоже), проблемы я встречал только на D4 при преобразовании out параметра процедуры (не Retval). Возможно, на D6 тоже это есть. В В твоем случае именно это. Проблемы не с перекодированием, а с вызовом метода.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.45 MB
Время: 0.027 c
3-81171
Cranium
2002-07-04 13:44
2002.07.25
IB и экспорт из txt


6-81402
SkyWalker
2002-05-15 15:04
2002.07.25
ISAPI


1-81229
Builder
2002-07-14 08:48
2002.07.25
Минимизация в трей вместо закрытия


3-81190
Link
2002-06-29 13:06
2002.07.25
фильтрация по дате


7-81506
BAHO
2002-05-06 03:34
2002.07.25
Привилегии...процессов




   Наверх