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

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

  • 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.

Howdy, Stranger!

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

Categories

In this Discussion