开发者

how to embed dll in vc++? how to extract that emeded dll to local drive? how to create tlb file based on the dll runtime?

开发者 https://www.devze.com 2023-02-19 01:55 出处:网络
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 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 Settings\Ankit.ass\My Documents\Visual Studio 2010\Projects\SetupValidationPro\SetupValidationPro\bin\Debug\SetupValidationPro.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 dynamicall开发者_如何转开发y using that extracted dll using vc++.. and load tlb file dynamically.

How can I achieve this?

Thanks

Ankit


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 <Msi.h>
#include <WinUser.h>
#include "windows.h"
#include <afxwin.h>
#include <afx.h>
#include <WinSpool.h>
#include <assert.h>
#include <WinBase.h>
#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 solved my issue. This code embeds the resources, extracts the resources and registers the type library at run-time.

0

精彩评论

暂无评论...
验证码 换一张
取 消