Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Categories

how to embed dll in vc++? how to extract that emeded dll to local driv

ankitkshahankitkshah Member Posts: 5
Hi..

I am working with vb.net .. I am new in vc++. I need to write some code in vc++ in some case. I need vc++ for following reason.

I created one dll in vb.net and make a tlb file based on vb.net dll. I import physical tlb file in my vc++ code with static value, as mentioned following.

#import "C:Documents and SettingsAnkit.assMy DocumentsVisual Studio 2010ProjectsSetupValidationProSetupValidationProinDebugSetupValidationPro.tlb" named_guids raw_interfaces_only

That's work fine.. My problem is that, I want to create a tlb file dynamically or runtime using vc++ and load that tlb file dynamically.

So, I need to embed a dll in vc++. How can I embed dll in vc++?

Now, I want to extract my embed dll to some physical file. so how can I extract my dll to physical location in vc++?

And, at the last step I want to create a tlb file dynamically using that extracted dll using vc++.. and load tlb file dynamically.

How can I achieve this?

Thanks

Ankit

Comments

  • ankitkshahankitkshah Member Posts: 5
    Hi,

    I resolve the issue after lots of googling.. This is the code from where my issue is resolve. I don't need native code for this..

    #include "stdafx.h"
    #include "stdafx.h"
    #include
    #include
    #include "windows.h"
    #include
    #include
    #include
    #include
    #include
    #include "resource.h"


    #define IDR_DLL1 101
    #define IDR_EXE1 102

    bool ExtractDll(const HINSTANCE hInstance, WORD resourceID, LPCTSTR szOutputFilename);
    bool ExtractExe(const HINSTANCE hInstance, WORD resourceID, LPCTSTR szOutputFilename);

    bool cmd();
    CString AppPath();

    #define RtlCopyMemory(Destination,Source,Length) memcpy((Destination),(Source),(Length))

    #import "dv.tlb" named_guids raw_interfaces_only

    using namespace dv;

    UINT __stdcall Validation( MSIHANDLE hModule )
    {
    /*BOOL qw = ExtractDll(AfxGetResourceHandle(), IDR_DLL1, _T("C:\VBDLL.dll") );
    BOOL qw1 = ExtractExe(AfxGetResourceHandle(), IDR_EXE1, _T("C:\RegAsm.exe") );*/

    BOOL qw = ExtractDll(AfxGetResourceHandle(), IDR_DLL1, (LPCTSTR)(AppPath() + _T("\dv.dll")) );
    if (qw == false)
    {
    return ERROR_INSTALL_USEREXIT;
    }
    BOOL qw1 = ExtractExe(AfxGetResourceHandle(), IDR_EXE1, (LPCTSTR)(AppPath() + _T("\RegAsm.exe")) );
    if (qw1 == false)
    {
    return ERROR_INSTALL_USEREXIT;
    }
    BOOL retCmd = cmd();

    if (retCmd==false)
    {
    return ERROR_INSTALL_USEREXIT;
    }


    IkeyvalidationPtr pICalc(__uuidof(SetupClass));

    long retun =0;

    BSTR strVer = SysAllocString(L"4.0.1517");

    pICalc->keyValidation(strVer,&retun);
    if (retun==1)
    {
    return ERROR_INSTALL_USEREXIT;
    }

    return ERROR_SUCCESS;
    }
    CString AppPath()
    {
    try
    {
    TCHAR path [MAX_PATH];

    ITEMIDLIST* pidl;

    HRESULT hRes = SHGetSpecialFolderLocation( NULL, CSIDL_APPDATA|CSIDL_FLAG_CREATE , &pidl );
    if (hRes==NOERROR)
    {
    SHGetPathFromIDList( pidl, path);
    }

    CString apPath;
    apPath = path;
    apPath = apPath + _T("\path");

    CreateDirectory((LPCWSTR) apPath,NULL);
    return apPath;
    }
    catch(...)
    {

    }
    }
    bool cmd()
    {
    CString m1=_T('');
    CString temp1 = _T("");
    CString temp = temp1 + _T('"');
    //CString s1 = temp + AppPath() + _T("\RegAsm.exe"); // Cascading concatenation
    CString s1 = temp + AppPath() + _T("\RegAsm.exe") + _T('"'); // Cascading concatenation
    CString s2 = _T(" /codebase");
    CString message = s1 + _T('"')+ _T(' ')+ _T('"') + AppPath() + _T("\dv.dll") + _T('"') +_T(' ') + _T("/tlb:")+('"') + AppPath() + _T("\dv.tlb") + _T('"')+ s2;
    CString message1 = _T('"') + AppPath() + _T("\dv.dll") + _T('"') +_T(' ') + _T("/tlb:")+('"') + AppPath() + _T("\dv.tlb") + _T('"')+ s2;

    SHELLEXECUTEINFO ExecuteInfo;

    memset(&ExecuteInfo, 0, sizeof(ExecuteInfo));

    ExecuteInfo.cbSize = sizeof(ExecuteInfo);
    ExecuteInfo.fMask = 0;
    ExecuteInfo.hwnd = 0;
    ExecuteInfo.lpVerb = L"runas"; // Operation to perform
    ExecuteInfo.lpFile = s1;
    ExecuteInfo.lpParameters = message1; // Additional parameters
    ExecuteInfo.lpDirectory = 0; // Default directory
    ExecuteInfo.nShow = SW_HIDE;
    //ExecuteInfo.nShow = SW_SHOW;
    ExecuteInfo.hInstApp = 0;

    if(ShellExecuteEx(&ExecuteInfo) == FALSE)
    {
    return false;
    }

    return true;
    }
    bool ExtractDll(const HINSTANCE hInstance, WORD resourceID, LPCTSTR szOutputFilename)
    {

    TCHAR sResName[5] = _T("#101");
    TCHAR sRestype[4] = _T("DLL");


    HRSRC hres = FindResource(AfxGetResourceHandle(), sResName,sRestype);


    if (hres == 0)
    {
    return false;
    }

    HGLOBAL hbytes = LoadResource(hInstance, hres);


    // Lock the resource

    LPVOID pdata = LockResource(hbytes);


    DWORD dwSize = SizeofResource(hInstance, hres);


    HANDLE hFile = CreateFile(szOutputFilename, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

    /// INSERT DATA IN FILE
    HANDLE hFilemap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, dwSize, NULL);

    LPVOID lpBaseAddress = MapViewOfFile(hFilemap, FILE_MAP_WRITE, 0, 0, 0);



    try
    {
    RtlCopyMemory(lpBaseAddress,pdata,dwSize);
    }
    catch ( ... )
    {
    return false;
    }

    UnmapViewOfFile(lpBaseAddress);

    CloseHandle(hFilemap);

    CloseHandle(hFile);

    return true ;
    }
    bool ExtractExe(const HINSTANCE hInstance, WORD resourceID, LPCTSTR szOutputFilename)
    {
    /*LPTSTR sArgv = argv[1];
    LPTSTR sArgv2 = argv[2];*/

    TCHAR sResName[5] = _T("#102");
    TCHAR sRestype[4] = _T("EXE");

    //HINSTANCE Nl=AfxGetInstanceHandle();

    HRSRC hres = FindResource(AfxGetResourceHandle(), sResName, sRestype);

    if (hres == 0)
    {
    return false;
    }


    HGLOBAL hbytes = LoadResource(hInstance, hres);

    // Lock the resource

    LPVOID pdata = LockResource(hbytes);


    DWORD dwSize = SizeofResource(hInstance, hres);

    HANDLE hFile = CreateFile(szOutputFilename, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

    /// INSERT DATA IN FILE
    HANDLE hFilemap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, dwSize, NULL);


    LPVOID lpBaseAddress = MapViewOfFile(hFilemap, FILE_MAP_WRITE, 0, 0, 0);


    try
    {
    RtlCopyMemory(lpBaseAddress,pdata,dwSize);
    }
    catch ( ... )
    {
    return false;
    }

    UnmapViewOfFile(lpBaseAddress);

    CloseHandle(hFilemap);

    CloseHandle(hFile);


    return true;
    }

    This is the MFC code from which I solved my issue. This code is embed the resources, extract that resources and run time register type library.

    Thanks

    Ankit
Sign In or Register to comment.