PDA

View Full Version : درخواست لاگین



newmusic
شنبه 16 خرداد 1388, 14:06 عصر
خودم چند تا صفحه لاگین دارم ولی یه صفحه لاگین قدرتمند میخوام

اگه با sql server داخلی خود ویژوال باشه خوبه

توضیحات:
وقتی به این صفحه رسیدیم یوزر و پس میخواد که با وارد کردنش اونوقت به صفحه بعدی دسترسی پیدا خواهیم کرد
حتما mfcباشه Visual c++

newmusic
شنبه 16 خرداد 1388, 20:07 عصر
کسی نبود!!!

حسین محمدی
سه شنبه 19 خرداد 1388, 10:20 صبح
من برای اینکار یک کلاس نوشته ام فعلا باگ ندارد (باگهایش را گرفته ام) ولی هنوز جا دارد بهینه شود.


هدر فایل DataConnectionEx.h


/*
DataConnectionEx
ver 1.0.0.3
modified date: Sunday, May 10, 2009
*/

#pragma once

class AFX_EXT_CLASS CDataConnectionEx :
public CDataConnection
{
public:
CDataConnectionEx(void);
~CDataConnectionEx(void);

bool GetDefaultFileName();

HRESULT LoadStringFromStorage(LPCOLESTR, CComHeapPtr<OLECHAR>&);

HRESULT OpenDataSource();
HRESULT OpenDataLinkProperties(HWND = GetActiveWindow(), DBPROMPTOPTIONS = DBPROMPTOPTIONS_WIZARDSHEET);
HRESULT OpenDataLinkProperties(LPCOLESTR, HWND = GetActiveWindow(), DBPROMPTOPTIONS = DBPROMPTOPTIONS_WIZARDSHEET);

//HRESULT GetCertificationID(UUID &uuid)
//HRESULT GetDatabaseInfo(VERSION &ver, SERVERINFO &svr, USERNAME &user)

protected:
OLECHAR szFileName[MAX_PATH];
UUID CertificationID;
public:
bool ConnectionStatus(void);
//operator const CSession&() throw();
};



فایل DataConnectionEx.cpp


#include "StdAfx.h"

//add OLE DB consumer support without using the ATL OLE DB Consumer Wizard
#include <atlbase.h>
#include <atldbcli.h>
#include <atldbsch.h> // if you are using schema templates

#include "DataConnectionEx.h"

CDataConnectionEx::CDataConnectionEx(void)
{
}

CDataConnectionEx::~CDataConnectionEx(void)
{
}

//Open a UDL Data Link Properties file and show its content to user
//User can update its content and save it to the file
//by press OK otherwise nothing will save to the file by press Cancel
//All items will saved to file except password for security issue
HRESULT CDataConnectionEx::OpenDataLinkProperties(LPCOLEST R szFileName, HWND hWnd, DBPROMPTOPTIONS dwPromptOptions) throw()
{
// My Code Here
CComPtr<IDataInitialize> spDataInit;
CComHeapPtr<OLECHAR> spszInitString;

HRESULT hr = CoCreateInstance(__uuidof(MSDAINITIALIZE), NULL, CLSCTX_INPROC_SERVER,
__uuidof(IDataInitialize), (void**)&spDataInit);
if (FAILED(hr))
return hr;

hr = LoadStringFromStorage(szFileName, spszInitString);
if (FAILED(hr))
return hr;

CComPtr<IDBInitialize> spInit;
// Given a connection string, instantiates and returns an uninitialized data source object.
hr = spDataInit->GetDataSource(NULL, CLSCTX_INPROC_SERVER, spszInitString /*szInitializationString*/,
__uuidof(IDBInitialize), (IUnknown**)&spInit);
if (FAILED(hr))
return hr;

// Code from HRESULT ATL::CDataSource::Open(HWND hWnd = GetActiveWindow(), DBPROMPTOPTIONS dwPromptOptions = DBPROMPTOPTIONS_WIZARDSHEET) throw()
CComPtr<IDBPromptInitialize> spDBInit;

hr = CoCreateInstance(__uuidof(DataLinks), NULL, CLSCTX_INPROC_SERVER,
__uuidof(IDBPromptInitialize), (void**) &spDBInit);
if (FAILED(hr))
return hr;

//CComPtr<IDBProperties> spProperties;
IDBProperties *pIDBProperties = NULL;

// Check that we are connected
//ATLASSUME(m_source.m_spInit != NULL);

hr = /*m_spInit*/ spInit->QueryInterface(__uuidof(IDBProperties), (void**)&pIDBProperties);
if (FAILED(hr))
return hr;

// see T** operator&() in CComPtrBase class
// The assert on operator& usually indicates a bug. If this is really
// what is needed, however, take the address of the p member explicitly.
hr = spDBInit->PromptDataSource(NULL, hWnd, dwPromptOptions, 0, NULL, NULL,
__uuidof(IDBProperties), (IUnknown**)&pIDBProperties);

if (hr == S_OK)
{
spszInitString.Free();
hr = spDataInit->GetInitializationString((IUnknown *)pIDBProperties, false, &spszInitString);
hr = spDataInit->WriteStringToStorage(szFileName, spszInitString, CREATE_ALWAYS);

hr = pIDBProperties->QueryInterface(&m_source.m_spInit);
if (SUCCEEDED(hr))
hr = m_source.m_spInit->Initialize();
}

if (pIDBProperties != NULL)
pIDBProperties->Release();

return hr;
}

//Open an empty UDL File and let user change item
//user can press OK to save content to the file
//File name will create as same as its Module File Name and Path
//at last try to connect again with: m_spInit->Initialize();
HRESULT CDataConnectionEx::OpenDataLinkProperties(HWND hWnd, DBPROMPTOPTIONS dwPromptOptions) throw()
{
//My Code Here
CComPtr<IDataInitialize> spDataInit;

HRESULT hr = CoCreateInstance(__uuidof(MSDAINITIALIZE), NULL, CLSCTX_INPROC_SERVER,
__uuidof(IDataInitialize), (void**)&spDataInit);
if (FAILED(hr))
return hr;

//Code from HRESULT ATL::CDataSource::Open(HWND hWnd = GetActiveWindow(), DBPROMPTOPTIONS dwPromptOptions = DBPROMPTOPTIONS_WIZARDSHEET) throw()
CComPtr<IDBPromptInitialize> spDBInit;

hr = CoCreateInstance(__uuidof(DataLinks), NULL, CLSCTX_INPROC_SERVER,
__uuidof(IDBPromptInitialize), (void**) &spDBInit);
if (FAILED(hr))
return hr;

CComPtr<IDBProperties> spIDBProperties;
hr = spDBInit->PromptDataSource(NULL, hWnd, dwPromptOptions, 0, NULL, NULL,
__uuidof(IDBProperties), (IUnknown**)&spIDBProperties);

if (hr == S_OK)
{
CComHeapPtr<OLECHAR> spszInitString;
//no password is not returned in the returned initialization string.
//http://msdn.microsoft.com/en-us/library/ms714195(VS.85).aspx
hr = spDataInit->GetInitializationString((IUnknown *)spIDBProperties, false, &spszInitString);
hr = spDataInit->WriteStringToStorage(szFileName, spszInitString, CREATE_ALWAYS);

//Open Data Source
hr = spIDBProperties->QueryInterface(&m_source.m_spInit);
if (SUCCEEDED(hr))
hr = m_source.m_spInit->Initialize();
}

return hr;
}

//This function loads a connection string.
//HRESULT ATL::CDataSource::OpenFromFileName(LPCOLESTR szFileName) throw()
//spszInitString must be a reference so that not destroy at the end of function
HRESULT CDataConnectionEx::LoadStringFromStorage(LPCOLESTR szFileName, CComHeapPtr<OLECHAR> &spszInitString) throw()
{
CComPtr<IDataInitialize> spDataInit;
//CComHeapPtr<OLECHAR> spszInitString;

HRESULT hr = CoCreateInstance(__uuidof(MSDAINITIALIZE), NULL, CLSCTX_INPROC_SERVER,
__uuidof(IDataInitialize), (void**)&spDataInit);
if (FAILED(hr))
return hr;

hr = spDataInit->LoadStringFromStorage(szFileName, &spszInitString);
if (FAILED(hr))
return hr;

return hr; //OpenFromInitializationString(spszInitString);
}

//This function Open DataSource.
//uses szFileName a private member of the class to open DataSource.
//szFileName contains a path name of a udl file which retrieve by GetDefaultFileName() method.
HRESULT CDataConnectionEx::OpenDataSource()
{
// TODO: Add your command handler code here

//set file name by call this function
//if it is returned false it means a file name has been truncated
//this method is not running correctly in windows xp
//try it and correct it look here: http://msdn.microsoft.com/en-us/library/ms683197(VS.85).aspx
if (!GetDefaultFileName())
return E_FAIL;

HRESULT hr = m_source.OpenFromFileName(szFileName);

CComHeapPtr<OLECHAR> spszInitString;
//hr = LoadStringFromStorage(szFileName, &spszInitString);
//if (FAILED(hr))
// return hr;

//return Open(spszInitString);

while (hr != DB_E_CANCELED && hr != S_OK)
{
//spszInitString.Free();
//hr = LoadStringFromStorage(szFileName, &spszInitString);

if (SUCCEEDED(hr))
{
//switch (hr)
//{
//}
}
else if (FAILED(hr))
{
switch (hr)
{
case E_FAIL:
MessageBox(AfxGetMainWnd()->m_hWnd, _T("A provider-specific error occurred."), _T("Connection"), MB_OK | MB_ICONERROR);
if (m_source.m_spInit != NULL)
{
if (m_source.m_spInit != NULL)
m_source.Close();
//MessageBox(AfxGetMainWnd()->m_hWnd, _T("Connection is already open! Closing countered with error"), _T("Error"), MB_OK);
}
hr = OpenDataLinkProperties(szFileName);

break;

case E_INVALIDARG :
//pwszFileName was a null pointer.
//ppwszInitializationString was a null pointer.
break;

case STG_E_FILENOTFOUND:
// %1 could not be found.
case STG_E_INVALIDHEADER:
// The file %1 is not a valid compound file.
// FileName was a file that is not a UDL format file.

// Instead of using this function
// I use my own function so that I can store the connection string to the udl file
hr = OpenDataLinkProperties();
break;

case STG_E_ACCESSDENIED:
//MessageBox(_T("Access Denied"));
//The caller has insufficient permission to open the file.
//The file is already open and locked for writing.
break;

case STG_E_INVALIDNAME:
//pwszFileName was an invalid file name.
break;

case DB_SEC_E_AUTH_FAILED:
//when we are here and spszInitString is not null
//its value is created here
spszInitString.Free();
hr = LoadStringFromStorage(szFileName, spszInitString);

m_source.Close();
hr = m_source.OpenFromInitializationString(spszInitStri ng, true);
break;
}
}
}

if (hr == S_OK)
hr = m_session.Open(m_source);

return hr;
}

//This method retrive default File Name from as same as execute file and its path
//and set szFileName by this method
bool CDataConnectionEx::GetDefaultFileName()
{
OSVERSIONINFO OSversion;
ZeroMemory(&OSversion, sizeof(OSVERSIONINFO));

OSversion.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&OSversion);
if (OSversion.dwMajorVersion >= 6 )
{
// windows Vista / Seven
}

DWORD dwBufferLenght = GetModuleFileNameW(NULL, szFileName, sizeof(szFileName) / sizeof(OLECHAR));
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
return false;
}

_wcslwr(szFileName);
LPOLESTR pEstension = wcsstr(szFileName, L".exe");

if (pEstension == NULL)
return false;

swprintf(pEstension, L".udl");

return true;
}

bool CDataConnectionEx::ConnectionStatus(void)
{
return *this;
}



برای Connect شدن به دیتابیس به این شرح عمل می کند که با تمام اطلاعات ، به جز پسورد را از یک فایل udl لود می کند و اگر تمام اطلاعات درست بود و فقط یوزر و پسورد را لازم داشت تنها آن را از کاربر می گیرد در غیر این صورت کل اطلاعات را از کاربر سوال خواهد کرد و بعد از تایید کاربر آنها را در همان فایل ذخیره می کند. البته اگر فایل موجود نباشد آن را ایجاد می کند.

حسین محمدی
سه شنبه 19 خرداد 1388, 10:30 صبح
برای استفاده از این کلاس من کانکشن را در کلاس Doc خود قرار داده ام

به این شکل:



static CDataConnectionEx m_DataConnection;
و سپس در متد OnNewDocument


HRESULT hr;
if (!m_DataConnection)
{
hr = m_DataConnection.OpenDataSource();
if (SUCCEEDED(hr))
...
}
این کلاس یک session در اختیار شما قرار می دهد تا بتوانید با آن ادامه کار خود را انجام دهید:

توسط اوپراتور


const CSession&