newmusic
شنبه 16 خرداد 1388, 15:06 عصر
خودم چند تا صفحه لاگین دارم ولی یه صفحه لاگین قدرتمند میخوام
اگه با sql server داخلی خود ویژوال باشه خوبه
توضیحات:
وقتی به این صفحه رسیدیم یوزر و پس میخواد که با وارد کردنش اونوقت به صفحه بعدی دسترسی پیدا خواهیم کرد
حتما mfcباشه Visual c++
newmusic
شنبه 16 خرداد 1388, 21:07 عصر
کسی نبود!!!
حسین محمدی
سه شنبه 19 خرداد 1388, 11: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, 11:30 صبح
برای استفاده از این کلاس من کانکشن را در کلاس Doc خود قرار داده ام
به این شکل:
    static CDataConnectionEx m_DataConnection;
و سپس در متد OnNewDocument
    HRESULT hr;
    if (!m_DataConnection)
    {
        hr = m_DataConnection.OpenDataSource();
        if (SUCCEEDED(hr))
...
    }
این کلاس یک session در اختیار شما قرار می دهد تا بتوانید با آن ادامه کار خود را انجام دهید:
توسط اوپراتور 
const CSession&
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.