自己写的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...

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

DllCall  (部分引用他人blog)  调用指定DLL(动态链接库)文件里面的函数。DllCall ( "dll", "返回值类型", "函数名称" [, "类型1", 参数1[, "类型n",...

[AHK]AutoHotKey 常用命令及示例

一、示例(自动打开QQ声音) Loop ;循环体 { WinWait, 与 qq009 交谈中, IfWinNotActive, 与 qq009 交谈中, , WinActivate, 与 q...

[AHK]利用AutoHotkey辅助设计

抛砖引玉 案例1:在cad里边的用热字串辅助输入 这样画图快,比如rec100,这类rec后面的XXX数值不固定的,从10到10000吧 :*:rec:: Input, UserInput, V T5...

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

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

VC 中调用Fortran动态链接库函数开发说明

说明:使用Fortran建立动态链接库,在C/C++语言环境中载入动态链接库,并调用动态链接库中函数。此方法使用动态载入动态链接库的方法。 开发环境: Compaq Visual Fortra...

LED动态链接库函数说明 V2.doc

  • 2011年08月01日 09:05
  • 48KB
  • 下载

在自己构造的DLL动态链接库中调用winmm.lib的mciSendString函数有问题

这是在我编写利用MCIzhong打开

VC 使用msxml6.dll动态链接库中的函数读写XML文件

VC 使用msxml6.dll动态链接库中的函数读写XML文件

C#调用C++动态链接库之Win32dll(函数)、MFCdll(对话框)

最近想把MFC写的对话框程序封装成.dll文件供C#程序调用,其中遇到了很多问题,现记录如下,以供参考! 一、在做MFC对话框封装之前顺带讲下函数的封装,这个相对简单。 1- 首先创建Win32 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自己写的DllCall类方便dll动态链接库函数调用
举报原因:
原因补充:

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