03.04.2006 12:21:14Использование интерфейса IRequest Ответов: 6
Алексей
День добрый,

Есть такой замечательный интерфейсик IRequest, позволяющий получить доступ к встроенному в IIS объекту Request, а имеено требуется доступ к свойству ClientCertificate.

В MSDNе написано, что включив "asptlb.h" в проект, нам будет счастье, однако написав следующее:
#include <windows.h>
#include <asptlb.h>

int main(int argc, char* argv[])
{

IRequestDictionary* ppDictReturn;
IRequest* i;
i-> get_ClientCertificate(&ppDictReturn);
return 0;
}

Мы благополучно вылетаем в Access Violation.

Я понимаю, что делаю не правильно. Очень прошу помочь понять, с какой стороны нужно подходить к этой задаче.

Заранее Благодарен
 
Ответы:
03.04.2006 12:38:52Kirill Sobolev
Как минимум надо создать объект который этот IRequest реализует.
03.04.2006 14:28:20Алексей
Спасибо, забылся =)

Однако, есть вопрос:
Пишем следующее
#define _WIN32_WINNT 0x500
#include <windows.h>
#include <Asptlb.h>
#include <stdio.h>

int main ()
{
IUnknown *P=NULL;
IRequest *R=NULL;
int x=0;
IRequestDictionary* Dict=0;
CoInitializeEx(0,COINIT_MULTITHREADED);
HRESULT res=CoCreateInstance(CLSID_Request,0,CLSCTX_INPROC_SERVER,IID_IRequest,(LPVOID*)&P);
if(res!=S_OK)
{
printf("error 1 %u", res);
goto err;
}
R=(IRequest *)P;
res=R->get_ClientCertificate(&Dict);

if(res!=S_OK)
{
printf("error 2 %u", res);
goto err2;
}

if(!Dict)
{
printf("error 3\n");
goto err2;
}
printf("Dict=%p",Dict);

Dict->get_Count(&x);
printf("x=%d\n",x);
Dict->Release();
err2:
R->Release();
err:
CoUninitialize();
return 0;
}

Объект IRequest создаеться на ура, но метод get_ClientCertificate ничего не возвращает, т.е. возвращает Dict=0.
Здесь в чем может быть подвох?
03.04.2006 15:39:21Kirill Sobolev
Он создан, но не инициализирован.
Этот объект доступен только в ASP страницах.
Вот, например, так (из MSDN)
<HTML>
<HEAD>
</HEAD>
<BODY>
SECURED DOCUMENT<br><br>
<H3>Client certificate</H3>
<% For Each key in Request.ClientCertificate
Response.Write(key & " = " &
Request.ClientCertificate(key) & "<BR>")
Next %>
</BODY>
</HTML>
03.04.2006 15:58:35Алексей
Понятно, что в асп страницах доступ к этому объекту получить непроблема, так как он родной для аспа. Задача то состоит в том, чтобы получить сертификат клиента не из аспа, а, допустим, из CGI скрипта.
04.04.2006 13:12:57Алексей
И еще раз здравствуйте,

Так есть какая-нибудь возможность получить доступ к объекту IRequest не из аспа, или ее нет?
04.04.2006 15:31:15Kirill Sobolev
Судя по тому что пишут в MSDN в разделе "IIS COM API for ASP Built-In Objects" можно вызвать из ASP, ASP.NET, COM и ISAPI application.