当前位置: 代码迷 >> C++ >> VC6.0源码中让外部DLL作为资源文件并调用解决办法
  详细解决方案

VC6.0源码中让外部DLL作为资源文件并调用解决办法

热度:8544   发布时间:2013-02-26 00:00:00.0
VC6.0源码中让外部DLL作为资源文件并调用
1.自己想写一个exe程序,需要使用一些外部的dll,但是客户下载的时候经常将DLL弄丢或者位置放错,所以想将DLL植入exe中,谢谢。不使用exe捆绑->杀毒软件原因。VC代码为非托管。

------解决方案--------------------------------------------------------
有,但是很麻烦,不知道你元不愿意用。。
且看步骤:
1. 将外部dll作为资源文件添加到你的工程中去。我的例子中,dll名字叫testdll.dll。

2. 将资源文件读入
3. 程序启动,将资源文件写入到一个临时文件。
4. 使用这个临时文件进行操作。

// testincludedll.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include "resource.h"
using namespace std;

// 重定义接口。
typedef int (*Add)(int,int);

int _tmain(int argc, _TCHAR* argv[])
{

// 读入dll资源文件
HMODULE hThis =  GetModuleHandle(NULL);  
HRSRC   hRes  =  FindResource(hThis, MAKEINTRESOURCE(IDR_DLL1), _T("dll"));
HGLOBAL hGres =  LoadResource(hThis, hRes); 


// 创建一个临时的dll文件。文件路径自定义。
HANDLE  hFile = CreateFile(_T("test.dll"), GENERIC_WRITE, NULL, NULL, CREATE_NEW, FILE_ATTRIBUTE_HIDDEN 
------解决方案--------------------------------------------------------
 FILE_ATTRIBUTE_ARCHIVE, NULL); 

// 将dll资源文件写入临时创建的dll文件中。
PVOID   pRes  =  LockResource(hGres);
DWORD  dwSize =  SizeofResource(NULL, hRes); 
DWORD dwSizeWritten = 0;  
    WriteFile(hFile, pRes, dwSize, &dwSizeWritten, NULL);  
    CloseHandle(hFile);  

// 再LOAD临时dll文件,执行操作。
//本例中,dll中接口是CTestDll::Add(int,int),你需要用dump指令,查看dll的导出接口,这里是("?Add@Ctestdll@@QAEHHH@Z"),然后获取这个乱码接口。
HMODULE hLib = LoadLibrary(_T("test.dll"));
Add add = (Add) GetProcAddress(hLib, "?Add@Ctestdll@@QAEHHH@Z"); 

// 调用方法。
int c = add(1, 2);
cout<<c<<endl;

cin>>c;
return 0;
}


看看输出效果:
  相关解决方案