怎么在C中使用DLL

zhan1094 2008-04-07 10:43:09
#include "dll.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include<time.h>
#pragma data_seg("sharehook")
HHOOK sharedata;
#pragma data_seg()

#pragma comment (linker,"/SECTION:sharehook,RWS")

LRESULT CALLBACK ShellHookProc(int nCode,WPARAM wParam,LPARAM lParam);
void SaveLog(char *n);
HINSTANCE hInce;
HHOOK myhook;

/*DLLIMPORT void ShellHook ()
{
MessageBox (0, "Hello World from DLL!\n", "Hi", MB_ICONINFORMATION);
}*/


BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
// sethook();
//sharedata=(HHOOK)SetWindowsHookEx(WH_SHELL,ShellHookProc,hInce,0);
break;

case DLL_PROCESS_DETACH:
//unsethook();
//if( UnhookWindowsHookEx(sharedata))
//sharedata=NULL;
break;

case DLL_THREAD_ATTACH:
break;

case DLL_THREAD_DETACH:
break;
}

/* Returns TRUE on success, FALSE on failure */
return TRUE;
}


DLLIMPORT int sethook()
{

if(myhook=(HHOOK)SetWindowsHookEx(WH_SHELL,ShellHookProc,hInce,0))
{
sharedata=myhook;
return 1;
}
return 0;
}


DLLIMPORT int unsethook()
{
if( UnhookWindowsHookEx(sharedata))
{
myhook=NULL;
return 1;
}
else
return 0;
}


LRESULT CALLBACK ShellHookProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(sharedata)
{
if (nCode==HSHELL_WINDOWCREATED)
{
HWND hwm=(HWND)wParam;
char *strName;
strName=(char*)malloc(256);
GetWindowText(hwm,strName,256);
SaveLog(strName);
/*if (strName=="扫雷")
{
GetSafeHwnd(WM_CLOSE,0,0);
}*/
}
}
return CallNextHookEx(myhook,nCode,wParam,lParam ) ;
}


void SaveLog(char *n)
{
//char *name=n;
FILE *log;
struct tm *systime;
time_t t;
t=time(NULL);
systime=localtime(&t);
if((log=fopen("syslog.log","a+"))==NULL)
exit(1);
else
fprintf(log,"open %s at %5d%5d%5d%5d%5d%5d",n,systime->tm_year,systime->tm_mon,systime->tm_mday,systime->tm_hour,systime->tm_min,systime->tm_sec);
fclose(log);
}


这是编译生成DLL的源程序,目的是设置全局的shell钩子
但不知道在其它的程序中怎么用编译连接好的DLL
有哪位可以帮帮我啊!!!!!!!!
...全文
163 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
michney 2008-04-07
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <windows.h>

typedef VOID (*MYPROC)(LPTSTR);

VOID main(VOID)
{
HINSTANCE hinstLib;
MYPROC ProcAdd;
BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;

// Get a handle to the DLL module.

hinstLib = LoadLibrary("myputs");

// If the handle is valid, try to get the function address.

if (hinstLib != NULL)
{
ProcAdd = (MYPROC) GetProcAddress(hinstLib, "myPuts");

// If the function address is valid, call the function.

if (fRunTimeLinkSuccess = (ProcAdd != NULL))
(ProcAdd) ("message via DLL function\n");

// Free the DLL module.

fFreeResult = FreeLibrary(hinstLib);
}

// If unable to call the DLL function, use an alternative.

if (! fRunTimeLinkSuccess)
printf("message via alternative method\n");
}
michney 2008-04-07
  • 打赏
  • 举报
回复
LoadLibrary()
GetProcAddress()
通过函数指针调用
FreeLibrary()
zhan1094 2008-04-07
  • 打赏
  • 举报
回复
我的编译环境是DEV-C++

总是出现 [Linker error] undefined reference to `_imp__sethook' 的错误

是怎么回事呢?
babyvox1999 2008-04-07
  • 打赏
  • 举报
回复
把头文件,DLL包含进其他工程的编译,连接依赖
xkyx_cn 2008-04-07
  • 打赏
  • 举报
回复
mark
zhan1094 2008-04-07
  • 打赏
  • 举报
回复
那要怎么做呢?楼上的!!!
sheenl 2008-04-07
  • 打赏
  • 举报
回复
你的这段钩子代码从哪里得来的? 好像是错的.

sharedata这个变量无法在不同的进程间共享.
帅得不敢出门 2008-04-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sleepynow 的回复:]
回楼上,定义一个函数指针啊
[/Quote]

是函数指针类型

这样方便后面指针的声明

MYPROC ProcAdd;
zhan1094 2008-04-07
  • 打赏
  • 举报
回复
谢谢各位~~
sleepynow 2008-04-07
  • 打赏
  • 举报
回复
回楼上,定义一个函数指针啊
zhan1094 2008-04-07
  • 打赏
  • 举报
回复
谢谢楼上的!

再请问一下 “typedef VOID (*MYPROC)(LPTSTR);” 是什么意思啊?

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧