请高手帮忙翻译c++的dll程序到delphi或者告知怎么用delphi调用以下c++写的dll (100分)

  • 主题发起人 主题发起人 qfgj
  • 开始时间 开始时间
Q

qfgj

Unregistered / Unconfirmed
GUEST, unregistred user!
// ChinarenMU.cpp : Defines the initialization routines for the DLL.
//
#include "stdafx.h"
#include <afxdllx.h>
#include "ChinarenMU.h"
//#include <windows.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#pragma data_seg("sharedata")
HHOOK glhHook=NULL;
HINSTANCE glhInstance=NULL;
UINT KeyPressed;
UINT AutoTalkFlag;
HWND hwndmu;
HHOOK hHook;
HINSTANCE pHinstance;
bool bs=false;
WNDPROC oldproc;
#pragma data_seg()
void __declspec(dllexport) WINAPI InstallHook(BOOL,DWORD);
BOOL WINAPI UnInstallHook();
LRESULT CALLBACK HookProc(int ,WPARAM ,LPARAM);
LRESULT CALLBACK MyMsgProc(HWND hwnd,UINT umsg,WPARAM wparam,LPARAM lparam);
bool __stdcall winmu(void);
BOOL WINAPI UnInstallHook();
static AFX_EXTENSION_MODULE ChinarenMUDLL = { NULL, NULL };
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("CHINARENMU.DLL Initializing!/n");

// Extension DLL one-time initialization
if (!AfxInitExtensionModule(ChinarenMUDLL, hInstance))
return 0;
//new CDynLinkLibrary(ChinarenMUDLL);
pHinstance = hInstance;
}
else
if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("CHINARENMU.DLL Terminating!/n");
// Terminate the library before destructors are called
//AfxTermExtensionModule(ChinarenMUDLL);
}
return 1;
// ok
}
void __declspec(dllexport) WINAPI InstallHook(BOOL IsHook,DWORD dwThreadId)
{
if(IsHook)
{
hHook=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)HookProc,pHinstance,dwThreadId);
}
else
{
UnInstallHook();
}
}
LRESULT CALLBACK HookProc(int ncode,WPARAM wparam,LPARAM lparam)
{
if(ncode<0)
return CallNextHookEx(hHook,ncode,wparam,lparam);//用一个bool变量让我们的winmu()只调用一次
if (!bs) winmu();
bs=true;
return CallNextHookEx(hHook,ncode,wparam,lparam);
}
bool __stdcall winmu(void)
{
long style;
long exstyle;
DEVMODE devmode;
hwndmu=GetForegroundWindow();
if(EnumDisplaySettings(0, 0, &amp;devmode))
{
devmode.dmPelsWidth=1024;
devmode.dmPelsHeight=768;
devmode.dmBitsPerPel=32;
devmode.dmDisplayFrequency=75;
ChangeDisplaySettings(&amp;devmode,0);
}
//修改窗体的style属性
style= GetWindowLong(hwndmu,GWL_STYLE);
style=style | WS_CAPTION
SetWindowLong(hwndmu,GWL_STYLE,style);//修改窗体的exstyle属性
exstyle=GetWindowLong(hwndmu,GWL_EXSTYLE);
exstyle=exstyle | WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
SetWindowLong(hwndmu,GWL_EXSTYLE,exstyle);//设置窗体的位置,取消其最前端显示,为图简单807,632是我自己随便设的//当然最好是先用AdjustWindowRect函数调整一下大小
SetWindowPos(hwndmu,HWND_NOTOPMOST,0,0,1024,768,SWP_SHOWWINDOW);
ShowWindow(hwndmu,SW_SHOWNORMAL);//修改窗体的回调函数地址到我们自己定义的回调函数
oldproc=(WNDPROC)GetWindowLong(hwndmu,GWL_WNDPROC);
if(SetWindowLong(hwndmu,GWL_WNDPROC,(long)MyMsgProc)==0)
return false;
return true;
}
LRESULT CALLBACK MyMsgProc(HWND hwnd,UINT umsg,WPARAM wparam,LPARAM lparam)
{
//消息过滤
switch (umsg)
{
case WM_ACTIVATEAPP:
case WM_ACTIVATE:
case WM_KILLFOCUS:
case WM_SETFOCUS:
case WM_CLOSE:
return 0;//这里是个关键,把这个计时器kill
case WM_TIMER:
if(wparam==0x3e9)
KillTimer(hwnd,wparam);
break;
}
return CallWindowProc(oldproc,hwnd,umsg,wparam,lparam);
}
BOOL WINAPI UnInstallHook()
{
UnhookWindowsHookEx(hHook);
return TRUE;
}
 
为什么要翻译啊,直接调用不就得了[8D]
 
c++不会[:(!]
想加点东西和改点东西[:(]
直接调用出错,用cdecl也是一样出错
 
应该是用stdcall方式
 
一开始就是用的stdcall,不行,找不到mfc42d.dll
C++做的dll还需要mfc42d.dll来支持?
 
WINAPI 方式就是 stdcall
如果你是在VC中编码的,他有带运行库与不带运行库二种编译方式,你现在是按:带运行库、调试版编译的,所以要mfc42d.dll
程序又不是很复杂,不就是一个HOOK嘛,用DELPHI写一个不就行了?
 
to:东兰梦舞
SetWindowLong(hwndmu,GWL_WNDPROC,(long)MyMsgProc
这句不是很明白,(long)mymsgproc是什么意思?
mymsgproc不用带参数吗?
帮忙全部翻译成delphi,再加100分
 
晕倒,我刚用这段程序做完测试
Delphi调用C++的dll
VC6编译,Delphi6程序调用
procedure InstallHook(b : Boolean;
swin : longWORD);stdcall;
external'ChinarenMU.dll';
后面调用
var
h : HWND;
begin
h := GetWindowThreadProcessId(Handle, nil);
InstallHook(true, h);
end;
 
关注
http://www.delphibbs.com/delphibbs/DispQ.asp?LID=2472197
 
to:品梅小哥
我用你的方法直接调用c++的dll出以下错误
debug assertion failed!
program:D:/project/project1.exe
file:afxtls.cpp
line:254
for information on how your program can cause an assertion
failure,see the Visual C++do
cumentation on asserts
 
估计是那个dll编译的时候没有把C++的库文件包含进去
 
http://sky.9226.com/hookapi.rar
这个是上面我提到那个帖子的主人的,我不知道你用的是不是这个代码
我用VC6 Debug模式编译,另外 Use MFC in a Shared DLL(本地所以无所谓,Static可能更好)
编译完成后考到Delphi做的应用程序目录下,然后Delphi程序编译
先声明
procedure InstallHook(b : Boolean;
swin : longWORD);stdcall;
external'ChinarenMU.dll';
我测试是加了一个按钮,然后按钮点击函数
var
h : HWND;
begin
h := GetWindowThreadProcessId(Handle, nil);
InstallHook(true, h);
end;
运行通过,没有任何问题
 
无法找到mfc42d.dll
 
呵呵,这个问题......??..!!!,
你还是在这里随便查查吧,要不CSDN也行www.csdn.net
[:D]
 
(long)mymsgproc是强制将函数地址作为长整数,对于函数名,VC与DELPHI都一样的,是一个地址。不用带参数的,这一句是告诉操作系统hwndmu的消息处理由mymsgproc接替了。
mymsgproc的函数是按标准消息处理函数定义的。

to:东兰梦舞
SetWindowLong(hwndmu,GWL_WNDPROC,(long)MyMsgProc
这句不是很明白,(long)mymsgproc是什么意思?
mymsgproc不用带参数吗?
帮忙全部翻译成delphi,再加100分
 
to:东兰梦舞
type
TMyMessage = procedure(hWnd: HWND;
Msg: UINT;
wParam: WPARAM;
lParam: LPARAM);stdcall;
var
OldMessage:TMyMessage;
Function Hookproc(iCode: Integer;
wParam: WPARAM;
lParam: LPARAM): LRESULT;
stdcall;
begin
if iCode<0 then
begin
CallNextHookEx(hhook,iCode,wParam,lParam);
exit;
end;

@OldMessage:=pchar(GetWindowLong(h,GWL_WNDPROC));
SetWindowLong(h,GWL_WNDPROC,integer(@Mymsgpro));
CallNextHookEx(hhook,iCode,wParam,lParam);
end;

function Mymsgpro(hWnd: HWND;
Msg: UINT;
wParam: WPARAM;
lParam: LPARAM): LRESULT;stdcall;
begin
CallWindowProc(@OldMessage,hwnd,msg,wparam,lparam);
end;

Procedure installhook;stdcall;
var h:HWND;ThreadID:LongWord;
begin
if hhook=0 then
begin
h:=findwindow(nil,'MU');
if h<>0 then
begin
ThreadID := GetWindowThreadProcessId(h, nil);
hhook:=SetWindowsHookEx(WH_CALLWNDPROC,@hookproc,hinstance,ThreadID);
end;
end;
end;
这样还是不行
 
我有一些delphi的HOOK源码,你留个邮箱,我发给你。
 
jeary_gzb@21cn.net
 
已发送。分为hook的dll、加载hook的exe二个工程。
 
接受答案了.
 
后退
顶部