自己写的DllCall类方便dll动态链接库函数调用

原创 2006年05月19日 17:10:00

 

/* 
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

AutoHotkey DllCall()

DllCall()http://www.autohotkey.com/docs/commands/DllCall.htmHomepageCommand ListCalls a function ins...
  • liuyukuan
  • liuyukuan
  • 2010年10月18日 21:52
  • 3020

autoIt DllCall 如何获得句柄和对窗口操作

DllCall  (部分引用他人blog)  调用指定DLL(动态链接库)文件里面的函数。DllCall ( "dll", "返回值类型", "函数名称" [, "类型1", 参数1[, "类型n",...
  • hililentao
  • hililentao
  • 2010年07月15日 16:46
  • 1699

exe函数与dll函数的相互调用

今天学习了DLL和EXE函数的相互调用,记录如下。 EXE程序代码: #include "stdafx.h" #include #define EXPORT __declspec(dllexp...
  • spiderlily
  • spiderlily
  • 2012年12月05日 13:37
  • 4924

CALL 调用之DLL实现

我们找到了F1-F8 功能CALL,并做了测试,发现287版武林外传,,已经封掉了WriteProcessMemory这个API函数所以写入代码再远程调用的方法已经不好用了,今天我们将介绍一种新的方法...
  • zang141588761
  • zang141588761
  • 2016年08月14日 20:42
  • 492

VS2010编写动态链接库DLL及单元测试用例,调用DLL测试正确性

本文将创建一个简单的动态链接库,并编写一个应用台控制程序使用该动态链接库,该动态链接库为“JAVA调用动态链接库DLL之JNative学习”中使用的DLL,只是项目及文件名称不同。创建动态链接库项目:...
  • testcs_dn
  • testcs_dn
  • 2014年05月27日 22:46
  • 24682

在自己的项目中调用别人的库的方法(static lib库,dynamic lib库以及dll动态库)

众所周知,出现.lib, .dll这种文件的原因是为了保护源代码,这个就不细说了。 用OpenCV的开源库来举个例子看一下就知道了: bin文件夹里面放的都是dll文件; lib文件夹里面放的...
  • woainishifu
  • woainishifu
  • 2016年12月07日 17:05
  • 1707

DLL编写中extern “C”和__stdcall的作用

动态链接库的使用有两种方式,一种是显式调用。一种是隐式调用。 (1)       显式调用:使用LoadLibrary载入动态链接库、使用GetProcAddress获取某函数地址。 (2...
  • dongchongyang
  • dongchongyang
  • 2016年10月25日 19:35
  • 3611

.NET调用dll动态链接库函数

调用动态链接库函数在实际工作中会遇到很多。这也是我很熟悉的方法,我想拿出来与大家分享一下。我就具体使用一个例子来进行这个功能的说明。           我想调用windows库函数进行读取ini文...
  • panliuwen
  • panliuwen
  • 2012年03月12日 19:28
  • 4955

案例一: 使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程。 首先用文本编辑器写一个C++源程序名为StackFrame.cpp ,代码如下:

案例一: 使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程。 首先用文本编辑器写一个C++源程序名为StackFrame.cpp ,代码如下: ...
  • kendyhj9999
  • kendyhj9999
  • 2017年06月27日 13:46
  • 389

delphi中动态链接库中函数的调用,DLL

  • 2018年01月16日 00:52
  • 203KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自己写的DllCall类方便dll动态链接库函数调用
举报原因:
原因补充:

(最多只允许输入30个字)