如何調用一个基于COM的接口--(IPStore)??? ( 积分: 300 )

  • 主题发起人 234307980
  • 开始时间
2

234307980

Unregistered / Unconfirmed
GUEST, unregistred user!
什么是PStore?
PStore的全称为:Protected Storage。在系统服务中我们可以看到它(9x没有)。它的作用就是为应用程序的安全保存做一个接口。在它里面记录了一些隐密的信息,比方说:
1. Outlook 密码
2. 删除的Outlook帐号密码
3. IE 密码保存站点密码
4. MSN登陆密码
5. IE 自动保存密码
等等。


網上有不少C代碼,看了半天,發現我不能直接將它轉為Delphi,因為我不知道去怎麽聲名和接收接口指针.

我動態载入Pstorec.dll,並得到PStoreCreateInstance的地址後,就不知道接下來要怎麽做了.
我最想知道Protected Storage的接口要怎麽接收.
大家能不能指教我一下.下面這個函數要怎麽用呢?
HRESULT PStoreCreateInstance(
IPStore** ppProvider, //输出,用于接收接口指针
PST_PROVIDERID* pProviderID, //指向Storege提供者的GUID,为0时为默认
void* pReserved, //保留,必须为NULL
DWORD dwFlags //保留,必须为0
);

相關資料請看http://www.itlove.net/Article/181/184/195/2005/200508079356.html
利用PStore获取帐号信息


這次我決定一次給300分(我認為很難)....希望大家幫幫忙.
 
原想整理出一份完整的代码,没时间弄了,干脆把在网上找到的代码整理后贴出来吧,
我测试过,能用

代码:
unit OutlookDecrypt;

interface

uses
  Windows,
  PStorageIntfs;//玎泐腩忸黜? 羿殡



function GetOutlookPass: string;


implementation



type

  PTChar = ^Char;
  TMyGUID = array of TGUID;
  TPStoreCreateInstance = function(var ppProvider: IPStore; pProviderID: PGUID; pReserved: Pointer; dwFlags: DWORD): HRESULT; stdcall;

var

 FLibrary: THandle;
 PStoreCreateInstance: TPStoreCreateInstance;
 FProvider: IPStore;
 Pass: string;



procedure CoTaskMemFree(pv: Pointer); stdcall; external 'ole32.dll' name 'CoTaskMemFree';
function StringFromCLSID(const clsid: TGUID; out psz: PWideChar): HResult; stdcall; external 'ole32.dll' name 'StringFromCLSID';

function PStorageConnect: Boolean;// 杨邃桧
 
参考一下:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

//定义一个函数指针,通过这个指针调用咱的函数
Tget_rtd = function (DateTime: string;
var ArrRetArray: PChar): Integer; stdcall;

var
Form1: TForm1;
MyProc: Tget_rtd; //定义一个函数指针的变量

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
LibHandle: THandle;
s: PChar;
begin
//装入DLL,返回大于零则成功
LibHandle:= LoadLibrary('Vbdll.dll');
if LibHandle > 0 then
begin
//获得进程地址
@MyProc:= GetProcAddress(LibHandle, 'get_rtd');
//你已经知道PStoreCreateInstance这个地址了,接着调用便是了
//调用DLL
if MyProc('19990701123359', s) = 0 then
begin
ShowMessage(s);
end else
ShowMessage('函数调用失败!');
//释放DLL
FreeLibrary(LibHandle);
end else
begin
ShowMessage('Open DLL Failed! :(');
end;
end;

end.
 
谢谢两位。

我这就试试。

先送上分。。。。。多谢
 
顶部