Visual c++ 如何在vc+中嵌入dll+;?如何将EmedDLL提取到本地驱动器?如何基于dll运行时创建tlb文件?

Visual c++ 如何在vc+中嵌入dll+;?如何将EmedDLL提取到本地驱动器?如何基于dll运行时创建tlb文件?,visual-c++,Visual C++,我正在使用vb.net。。我是vc++新手。在某些情况下,我需要用vc++编写一些代码。我需要vc++的原因如下 我在vb.net中创建了一个dll,并基于vb.net dll创建了一个tlb文件。我在vc++代码中使用静态值导入物理tlb文件,如下所述 #仅导入“C:\Documents and Settings\Ankit.ass\My Documents\Visual Studio 2010\Projects\SetupValidationPro\SetupValidationPro\bi

我正在使用vb.net。。我是vc++新手。在某些情况下,我需要用vc++编写一些代码。我需要vc++的原因如下

我在vb.net中创建了一个dll,并基于vb.net dll创建了一个tlb文件。我在vc++代码中使用静态值导入物理tlb文件,如下所述

#仅导入“C:\Documents and Settings\Ankit.ass\My Documents\Visual Studio 2010\Projects\SetupValidationPro\SetupValidationPro\bin\Debug\SetupValidationPro.tlb”命名为“guids原始接口”

那工作很好。。我的问题是,我想使用vc++动态创建一个tlb文件或运行时,并动态加载该tlb文件

所以,我需要在vc++中嵌入一个dll。如何在vc++中嵌入dll

现在,我想将我的嵌入dll提取到一些物理文件中。那么如何在vc++中将dll提取到物理位置呢

在最后一步,我想使用vc++动态创建一个tlb文件,使用提取的dll。。并动态加载tlb文件

我怎样才能做到这一点

谢谢


Ankit

我在谷歌搜索了很多次后才解决了这个问题。。这是解决我的问题的代码。我不需要本机代码

#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;
}
#包括“stdafx.h”
#包括“stdafx.h”
#包括
#包括
#包括“windows.h”
#包括
#包括
#包括
#包括
#包括
#包括“resource.h”
#定义IDR_DLL1 101
#定义IDR_EXE1 102
bool ExtractDll(const HINSTANCE HINSTANCE,WORD resourceID,LPCTSTR szOutputFilename);
bool ExtractExe(const HINSTANCE HINSTANCE,WORD resourceID,LPCTSTR szOutputFilename);
boolcmd();
CString-AppPath();
#定义RtlCopyMemory(目标、源、长度)memcpy((目标)、(源)、(长度))
#仅导入名为\u guids原始\u接口\u的“dv.tlb”
使用名称空间dv;
UINT标准调用验证(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”));
如果(qw==false)
{
返回错误\u安装\u用户退出;
}
BOOL qw1=ExtractExe(AfxGetResourceHandle(),IDR_EXE1,(LPCTSTR)(AppPath()+_T(“\\RegAsm.exe”));
如果(qw1==false)
{
返回错误\u安装\u用户退出;
}
BOOL-retCmd=cmd();
如果(retCmd==false)
{
返回错误\u安装\u用户退出;
}
IkeyvalidationPtr pICalc(设置类);
长时间返回=0;
BSTR服务器=系统分配字符串(L“4.0.1517”);
pICalc->keyValidation(服务器和重新运行);
如果(retun==1)
{
返回错误\u安装\u用户退出;
}
返回错误\成功;
}
CString AppPath()
{
尝试
{
TCHAR路径[最大路径];
项目列表*pidl;
HRESULT hRes=SHGetSpecialFolderLocation(NULL、CSIDL_APPDATA、CSIDL_FLAG_CREATE和pidl);
如果(hRes==NOERROR)
{
SHGetPathFromIDList(pidl,路径);
}
卡斯特林·阿巴斯;
apPath=路径;
apPath=apPath+\u T(\\path”);
CreateDirectory((LPCWSTR)apPath,NULL);
返回阿巴斯;
}
捕获(…)
{
}
}
boolcmd()
{
CString m1=_T(“”);
CString temp1=_T(“”);
CString temp=temp1+_T(“”);
//CString s1=temp+AppPath()+_T(“\\RegAsm.exe”);//级联级联
CString s1=temp+AppPath()+_T(“\\RegAsm.exe”)+_T(“”);//级联级联
CString s2=_T(“/codebase”);
CString message=s1++u T(“”)++u T(“”)++AppPath()++u T(“\\dv.dll”)++u T(“”)++u T(“/tlb:”)++(“”)+AppPath()++u T(“\\dv.tlb”)++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”;//要执行的操作
ExecuteInfo.lpFile=s1;
ExecuteInfo.lpParameters=message1;//其他参数
ExecuteInfo.lpDirectory=0;//默认目录
ExecuteInfo.nShow=SW_HIDE;
//ExecuteInfo.nShow=SW_SHOW;
ExecuteInfo.hInstApp=0;
if(ShellExecuteEx(&ExecuteInfo)==FALSE)
{
返回false;
}
返回true;
}
bool ExtractDll(const HINSTANCE HINSTANCE,WORD resourceID,LPCTSTR szOutputFilename)
{
TCHAR sResName[5]=_T(“101”);
TCHAR sRestype[4]=“DLL”);
HRSRC hres=FindResource(AfxGetResourceHandle(),sResName,sRestype);
如果(hres==0)
{
返回false;
}
HGLOBAL hbytes=负载资源(hInstance,hres);
//锁定资源
LPVOID pdata=锁资源(hbytes);
DWORD dwSize=SizeofResource(hInstance,hres);
HANDLE hFile=CreateFile(szOutputFilename,GENERIC_READ | GENERIC_WRITE,0,NULL,始终创建,文件属性_NORMAL,NULL);
///在文件中插入数据
HANDLE hFilemap=CreateFileMapping(hFile,NULL,PAGE\u READWRITE,0,dwSize,NULL);
LPVOID lpBaseAddress=MapViewOfFile(hFilemap,FILE\u MAP\u WRITE,0,0);
尝试
{
RtlCopyMemory(lpBaseAddress、pdata、dwSize);
}
捕获(…)
{
返回false;
}
解编文件(lpBaseAddress);
CloseHandle(hFilemap);
闭合手柄(hFile);
返回true;
}
bool ExtractExe(const HINSTANCE HINSTANCE,WORD resourceID,LPCTSTR szOutputFilename)
{
/*LPTSTR sArgv=argv[1];
LPTSTR sArgv2=argv[2]*/
TCHAR sResName[5]=“102”);
TCHAR sRestype[4]=“EXE”);
//HINSTANCE Nl=AfxGetInstanceHandle();
HRSRC hres=FindResource(AfxGetResourceHandle(),sResNam