/*
DllCall类,用来方便调用动态链接库内的函数。最初版。
使用方法:
DllCall<FunctionTYPE> SomeCall(动态链接库名,函数名,[函数索引]);
以后正常调用SomeCall.call(参数);
使用前可以用if(SomeCall)来检测是否可调用。
作者:苏晓
时间:2006年5月文件:DllCall.h
*/
#ifndef DLLCALLCLASS__
#define DLLCALLCLASS__
#include <string>
#include <windows.h>
template <typename TYPE>
class DllCall
{
std::string DllName;
std::string FunctionName;
int Index;
HMODULE dll;
public:
TYPE call;
DllCall(std::string dllname,std::string functionname,int index=-1)
{
DllName=dllname;
FunctionName=functionname;
Index=index;
call=NULL;
dll=NULL;
get();
};
~DllCall()
{
if(dll)
{
try{
FreeLibrary(dll);
}catch(...)
{
};
};
};
private:
void* Get()
{
if(Index==-1)
{
if(DllName!=""&&FunctionName!="")
{
dll=GetModuleHandle(DllName.c_str());
if(dll)
{
void * ret=GetProcAddress(dll,FunctionName.c_str());
CloseHandle(dll);
dll=NULL;
return ret;
}else
{
dll=LoadLibrary(DllName.c_str());
if(dll)
{
return GetProcAddress(dll,FunctionName.c_str());
}else
{
return NULL;
};
};
}else
{
return NULL;
};
}else
{
if(DllName!="")
{
dll=GetModuleHandle(DllName.c_str());
if(dll)
{
void * ret=GetProcAddress(dll,MAKEINTRESOURCE(Index));
CloseHandle(dll);
dll=NULL;
return ret;
}else
{
dll=LoadLibrary(DllName.c_str());
if(dll)
{
return GetProcAddress(dll,MAKEINTRESOURCE(Index));
}else
{
return NULL;
};
};
}else
{
return NULL;
};
};
};
bool get()
{
if((call=(TYPE)Get()))
{
return true;
}else
{
return false;
};
};
public:
operator int()
{
return (call!=NULL);
};
};
#endif
/*VC6下测试文件test.cpp*/
#include "DllCall.h"
typedef unsigned long DWORD;
//DllCall<int (__stdcall*)(int)> mybox2("shell32.dll","",60); //放在全局不行,销毁不正常,VC6现在才觉得它很变态!
DllCall<DWORD(*)(DWORD,DWORD,DWORD,DWORD)> mybox1("user32.dll","MessageBoxA");
int main(int argc, char* argv[])
{
MessageBox(NULL,"COM",NULL,NULL);
DllCall<int (__stdcall*)(int)> mybox2("shell32.dll","",60);
if(mybox1)
{
mybox1.call(NULL,(DWORD)"HEHE",NULL,NULL);
};
if(mybox2)
{
mybox2.call(0);
};
MessageBox(NULL,"COM",NULL,NULL);
return 0;
}
/*
VC6真的是很变态!还是我的机器上的VC6很变态!?还是我的调用约定__stdcall 写错了?优化选项不能打开,否则汇编代码是错误的,调用完毕销毁错误。真是奇怪的很啊。下面是改进版本,GCC,VC通用。推荐用GCC编译器。不会像VC一样出错。
*/
/*
DllCall类,用来方便调用动态链接库内的函数。改进版。
使用方法:
DllCall<FunctionTYPE> SomeCall(动态链接库名,函数名,[函数索引]);
以后正常调用SomeCall.call(参数);
或者SomeCall(参数);
使用前可以用if(SomeCall)来检测是否可调用。
作者:苏晓
时间:2006年5月
*/
#ifndef DLLCALLCLASS__
#define DLLCALLCLASS__
#include <string>
#include <windows.h>
template <typename TYPE>
class DllCall
{
HMODULE dll;
public:
TYPE call;
DllCall(std::string dllname,std::string functionname,int index=-1)
{
std::string DllName;
std::string FunctionName;
int Index;
DllName=dllname;
FunctionName=functionname;
Index=index;
call=NULL;
dll=NULL;
call=(TYPE)Get(DllName,FunctionName,Index);
};
~DllCall()
{
if(dll)
{
try{
FreeLibrary(dll);
}catch(...)
{
};
};
};
private:
TYPE Get(std::string DllName,std::string FunctionName,int Index)
{
if(Index==-1)
{
if(DllName!=""&&FunctionName!="")
{
dll=GetModuleHandle(DllName.c_str());
if(dll)
{
TYPE ret=(TYPE)GetProcAddress(dll,FunctionName.c_str());
CloseHandle(dll);
dll=NULL;
return ret;
}else
{
dll=LoadLibrary(DllName.c_str());
if(dll)
{
return (TYPE)GetProcAddress(dll,FunctionName.c_str());
}else
{
return (TYPE)NULL;
};
};
}else
{
return (TYPE)NULL;
};
}else
{
if(DllName!="")
{
dll=GetModuleHandle(DllName.c_str());
if(dll)
{
TYPE ret=(TYPE)GetProcAddress(dll,MAKEINTRESOURCE(Index));
CloseHandle(dll);
dll=NULL;
return ret;
}else
{
dll=LoadLibrary(DllName.c_str());
if(dll)
{
return (TYPE)GetProcAddress(dll,MAKEINTRESOURCE(Index));
}else
{
return (TYPE)NULL;
};
};
}else
{
return (TYPE)NULL;
};
};
};
public:
operator int()
{
return (call!=NULL);
};
operator TYPE()
{
return call;
};
};
#endif
DllCall类,用来方便调用动态链接库内的函数。最初版。
使用方法:
DllCall<FunctionTYPE> SomeCall(动态链接库名,函数名,[函数索引]);
以后正常调用SomeCall.call(参数);
使用前可以用if(SomeCall)来检测是否可调用。
作者:苏晓
时间:2006年5月文件:DllCall.h
*/
#ifndef DLLCALLCLASS__
#define DLLCALLCLASS__
#include <string>
#include <windows.h>
template <typename TYPE>
class DllCall
{
std::string DllName;
std::string FunctionName;
int Index;
HMODULE dll;
public:
TYPE call;
DllCall(std::string dllname,std::string functionname,int index=-1)
{
DllName=dllname;
FunctionName=functionname;
Index=index;
call=NULL;
dll=NULL;
get();
};
~DllCall()
{
if(dll)
{
try{
FreeLibrary(dll);
}catch(...)
{
};
};
};
private:
void* Get()
{
if(Index==-1)
{
if(DllName!=""&&FunctionName!="")
{
dll=GetModuleHandle(DllName.c_str());
if(dll)
{
void * ret=GetProcAddress(dll,FunctionName.c_str());
CloseHandle(dll);
dll=NULL;
return ret;
}else
{
dll=LoadLibrary(DllName.c_str());
if(dll)
{
return GetProcAddress(dll,FunctionName.c_str());
}else
{
return NULL;
};
};
}else
{
return NULL;
};
}else
{
if(DllName!="")
{
dll=GetModuleHandle(DllName.c_str());
if(dll)
{
void * ret=GetProcAddress(dll,MAKEINTRESOURCE(Index));
CloseHandle(dll);
dll=NULL;
return ret;
}else
{
dll=LoadLibrary(DllName.c_str());
if(dll)
{
return GetProcAddress(dll,MAKEINTRESOURCE(Index));
}else
{
return NULL;
};
};
}else
{
return NULL;
};
};
};
bool get()
{
if((call=(TYPE)Get()))
{
return true;
}else
{
return false;
};
};
public:
operator int()
{
return (call!=NULL);
};
};
#endif
/*VC6下测试文件test.cpp*/
#include "DllCall.h"
typedef unsigned long DWORD;
//DllCall<int (__stdcall*)(int)> mybox2("shell32.dll","",60); //放在全局不行,销毁不正常,VC6现在才觉得它很变态!
DllCall<DWORD(*)(DWORD,DWORD,DWORD,DWORD)> mybox1("user32.dll","MessageBoxA");
int main(int argc, char* argv[])
{
MessageBox(NULL,"COM",NULL,NULL);
DllCall<int (__stdcall*)(int)> mybox2("shell32.dll","",60);
if(mybox1)
{
mybox1.call(NULL,(DWORD)"HEHE",NULL,NULL);
};
if(mybox2)
{
mybox2.call(0);
};
MessageBox(NULL,"COM",NULL,NULL);
return 0;
}
/*
VC6真的是很变态!还是我的机器上的VC6很变态!?还是我的调用约定__stdcall 写错了?优化选项不能打开,否则汇编代码是错误的,调用完毕销毁错误。真是奇怪的很啊。下面是改进版本,GCC,VC通用。推荐用GCC编译器。不会像VC一样出错。
*/
/*
DllCall类,用来方便调用动态链接库内的函数。改进版。
使用方法:
DllCall<FunctionTYPE> SomeCall(动态链接库名,函数名,[函数索引]);
以后正常调用SomeCall.call(参数);
或者SomeCall(参数);
使用前可以用if(SomeCall)来检测是否可调用。
作者:苏晓
时间:2006年5月
*/
#ifndef DLLCALLCLASS__
#define DLLCALLCLASS__
#include <string>
#include <windows.h>
template <typename TYPE>
class DllCall
{
HMODULE dll;
public:
TYPE call;
DllCall(std::string dllname,std::string functionname,int index=-1)
{
std::string DllName;
std::string FunctionName;
int Index;
DllName=dllname;
FunctionName=functionname;
Index=index;
call=NULL;
dll=NULL;
call=(TYPE)Get(DllName,FunctionName,Index);
};
~DllCall()
{
if(dll)
{
try{
FreeLibrary(dll);
}catch(...)
{
};
};
};
private:
TYPE Get(std::string DllName,std::string FunctionName,int Index)
{
if(Index==-1)
{
if(DllName!=""&&FunctionName!="")
{
dll=GetModuleHandle(DllName.c_str());
if(dll)
{
TYPE ret=(TYPE)GetProcAddress(dll,FunctionName.c_str());
CloseHandle(dll);
dll=NULL;
return ret;
}else
{
dll=LoadLibrary(DllName.c_str());
if(dll)
{
return (TYPE)GetProcAddress(dll,FunctionName.c_str());
}else
{
return (TYPE)NULL;
};
};
}else
{
return (TYPE)NULL;
};
}else
{
if(DllName!="")
{
dll=GetModuleHandle(DllName.c_str());
if(dll)
{
TYPE ret=(TYPE)GetProcAddress(dll,MAKEINTRESOURCE(Index));
CloseHandle(dll);
dll=NULL;
return ret;
}else
{
dll=LoadLibrary(DllName.c_str());
if(dll)
{
return (TYPE)GetProcAddress(dll,MAKEINTRESOURCE(Index));
}else
{
return (TYPE)NULL;
};
};
}else
{
return (TYPE)NULL;
};
};
};
public:
operator int()
{
return (call!=NULL);
};
operator TYPE()
{
return call;
};
};
#endif