VB中如何调用VC写的DLL?附上DLL的源...
大家能否帮忙?
LRESULT CALLBACK huitiao(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam);//回调消息
void NewXian(LPARAM lP); //线程函数
HANDLE hd;
WNDPROC wnp;
DWORD pid;
HWND hwnd;
DWORD upqb; //上墙壁
DWORD* pupqb; //上墙壁
DWORD baseaddr; //基地址
DWORD dg;
DWORD downqb; //下墙壁
DWORD* pdownqb; //下墙壁
DWORD feitian; //飞天
DWORD* pfeitian; //飞天
DWORD guotu; //过图
DWORD* pguotu; //过图
DWORD gjjs;
DWORD* pgjjs;
DWORD shun1 = NULL;
DWORD shun2 = NULL;
DWORD shun3 = NULL;
HANDLE hdm;
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if(ul_reason_for_call==DLL_PROCESS_ATTACH)
{
pid=GetCurrentProcessId(); //获取当前进程ID
CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)NewXian,NULL,NULL,NULL);//创建新线程
CreateThread(NULL,255,(LPTHREAD_START_ROUTINE)ThreadProc,NULL,NULL,NULL);
}
return TRUE;
}
//////////
LRESULT CALLBACK huitiao(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)//接受消息用的
{
switch(msg)
{
case(WM_USER+540):
{
if(wParam==1) //MISS
{
PWORD pdqjz=(PWORD)((DWORD)DongTai + (DWORD)0xF0);
BYTE mxdysp[24]={0x47, 0x33, 0x79, 0xAE, 0x0A, 0xFB, 0x76, 0xC5, 0x24, 0xA1, 0x1D, 0x16, 0x82, 0x1B, 0x53, 0x52, 0xDC, 0x98, 0x92, 0x12, 0x38, 0x90, 0xDA, 0x91};
memcpy(pdqjz,&mxdysp,24);
}
if(wParam==2) //关闭MISS
{
PWORD pdqjz=(PWORD)((DWORD)DongTai + (DWORD)0xF0);
BYTE mxdysp[24]={0xA1, 0x76, 0xE4, 0xB0, 0xB5, 0x23, 0x87, 0x0D, 0xEA, 0x6F, 0xD9, 0x6D, 0xE0, 0x3F, 0xB2, 0xA1, 0xFF, 0x91, 0x0D, 0x05, 0x7E, 0x90, 0xE6, 0x6D };
memcpy(pdqjz,&mxdysp,24);
}
}
return CallWindowProcA(wnp,hwnd,msg,wParam,lParam);//传递给下一个函数
}
void NewXian(LPARAM lP)
{
DWORD id;
HWND hwd=FindWindowA("ThunderRT6FormDC",XppName);
while(!hwnd)
{
Sleep(2000);//线程暂停2秒
hwnd = FindWindowA("MapleStoryClass","MapleStory");//寻找窗口句柄
}
GetWindowThreadProcessId(hwnd,&id);//从窗口句柄获取窗口当前进程ID
if(id!=pid) //比较进程ID是否相等
{
MessageBoxA(NULL,"程序过程出错,错误码:001","ERROR",MB_OK);
return;
}
wnp=(WNDPROC)SetWindowLong(hwnd,GWL_WNDPROC,(LONG)huitiao);//设置回调函数
if(!wnp)
{
MessageBoxA(NULL,"程序过程出错,错误码:002","ERROR",MB_OK);
return;
}
SendMessage(hwd,WM_USER + 541,10,NULL);
addr = (DWORD)0x00020100;
VirtualAlloc(&addr,1024,MEM_COMMIT,64);
VirtualAlloc(&addr1,1024,MEM_COMMIT,64);
BYTE sj[56]={0x8B,0x1D,0xB0,0x56,0xC4,0x00,0x8B,0x9B,0x48,0x10,0x00,0x00,0x39,0xDE,0x75,0x1E,0x90,0x90,0x90,0x90,0xA1,0x58,0x5A,0xC4,0x00,0x8B,0x80,0x78,0x09,0x00,0x00,0x8B,0x98,0x84,0x00,0x00,0x00,0x8B,0x80,0x88,0x00,0x00,0x00,0x89,0x5F,0xFC,0x89,0x07,0x8B,0x5D,0x14,0xE9,0x2D,0x03,0x9F,0x00};
memcpy((void*)addr,&sj,56);
return;
}
话说不能上传文件还真是麻烦啊. 当然了.如果谁想要源代码 ..可以联系我QQ
我的QQ是:200551089 这个问题对我很严肃..大家帮帮忙吧 如果VC做接口给VB调用通常采用4种方法
1、做动态连接库,提供API接口
2、做 COM 接口组件
3、做 ActiveX 控件
4、以应用程序或NT服务程序做管道、网络、DDE、Windows消息做通讯接口
比较常用和方便的就是提供 API 接口,如果做 API 接口,你最好先看看我的这篇文章:
http://blog.csdn.net/SupermanKing/archive/2010/03/05/5347763.aspx
注意,函数最好声明成静态的,如:
void _stdcall NewXian(long lP)
这里特别说明一下字符串传递的一些注意事项
对于传入的VB String 类型,可以直接使用 char * 类型,
如果需要返回 String 类型给 VB,用 BSTR * 作为返回类型定义
如果用 COM 或 ActiveX 作为接口,只要尊崇 COM 和 ActiveX 模型就可以了。
要注意的是类型不能随便使用,因为 COM 接口的类型和 VC 本身的类型还是有区别的。 留个记号 回家研究
补充:VB , 基础类