Visual c++ 如何在vc+中嵌入dll+;?如何将EmedDLL提取到本地驱动器?如何基于dll运行时创建tlb文件?
我正在使用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文件 我怎样才能做到这一点 谢谢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
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