UINT MyNewThread(LPVOID)
{
AfxMessageBox("MyNewThread Is Begin");
return true;
}
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
AfxBeginThread(MyNewThread,NULL);
}
}
这个DLL为什么不能正常运行呢??
在资源管理器中能看到程序已经运行,但 主调的EXE 程序 不显示界面,这是怎么回事呢??
如果把AfxBeginThread(MyNewThread,NULL);换成AfxMessageBox("hello");程序就可以正常运行,
难道在DLLMAIN中不能启动新线程吗???
{
AfxMessageBox("MyNewThread Is Begin");
return true;
}
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
AfxBeginThread(MyNewThread,NULL);
}
}
这个DLL为什么不能正常运行呢??
在资源管理器中能看到程序已经运行,但 主调的EXE 程序 不显示界面,这是怎么回事呢??
如果把AfxBeginThread(MyNewThread,NULL);换成AfxMessageBox("hello");程序就可以正常运行,
难道在DLLMAIN中不能启动新线程吗???
解决方案 »
- 完成端口accept后为什么要跟个WSARecve?
- 一年以前的问题,还是没找到解决办法。
- 如何把Access转成SQL Server的方法介绍
- 请问为什么我按FAQ区里介绍的横向打印后设置的字体全乱了?
- 請問VC里有沒有現成處理隊列的東西, 而且是不占內存的?
- 急急急!!!哪位有没有VC下的 ping 函数?帮帮忙,另加100分!!!
- 侯杰的深入浅出mfc
- 请教:把下面的Delphi程序代码转化为相应的VC代码。
- 如何使用字体对话框?
- 关于com指针IDispatch转换成其他指针的问题
- 为什么编辑框背景透明以后,backspace键光标是退格了,可字符没删掉啊?
- _int8和char的区别?
if (dwReason == DLL_THREAD_ATTACH )
{
AfxBeginThread(MyNewThread,NULL);
}
本人有另外一个问题:(有关类的汇出问题)
我在用类编写DLL的时候,发现所汇出的api,可以被VC动态或者静态调用,而不能被C++ Builder调用,请问各位是何原因??? (我已经便要了适应BCB环境下的lib文件) 先谢啦!
class CDllFun : public CWinThread
{
DECLARE_DYNCREATE(CDllFun)
protected:
CDllFun();
public:
public:
virtual BOOL InitInstance();
virtual int ExitInstance();.......};
BOOL CDllFun::InitInstance()
{
AfxMessageBox("MyNewThread Is Begin");
return TRUE;
}DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
AfxBeginThread(RUNTIME_CLASS(CDllFun)); //注意此处:)
}
}////////////////////////////////////////
上面的处理方法不会有问题吧?但还是不行啊!现像与一贴一样!
**************************************************************************************
TO :dafan(大帆)
用你的方法也不行啊!!虽然看到主调程序EXE的界面了!但"MyNewThread Is Begin"这个消息没有出现啊!***************************************************************************************
TO :dafan(大帆)
你提问的问题 是不是由于函数调用格式的原因?试试用extern"c"看看
***************************************************************************************谢谢各位的帮助!:)
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif #include "windows.h"
#ifdef __cplusplus
extern "C"
{
#endif // This class is exported from the AutoMAC_Client.dll
class MYDLL_API CMYDLL
{
public:
CMYDLL(void);
~MYDLL(void); void WINAPI Fun();
} #ifdef __cplusplus
}
#endif
void WINAPI Fun()
{
.......
} 当然,上面不是我的Source Code,但是类似。
BCB的提示是什么??
请看我用工具抓到的结果: 在VC中的
5 _MYDLL_Message_Out@4
2 _MYDLL_Client_Init@0
0 _MYDLL_ClientClose@0
6 _MYDLL_Return_MACAddress@0
3 _MYDLL_Client_Status@0
7 _MYDLL_TestProgram_Status@4
4 _MYDLL_GetMACInfo@12
1 _MYDLL_ClientGetInfo@8
8 _ClientScanMAC@4 在BCB中:
0 _MYDLL_ClientClose@0
0 _MYDLL_ClientGetInfo@8
0 _MYDLL_Client_Init@0
0 _MYDLL_Client_Status@0
0 _MYDLL_GetMACInfo@12
0 _MYDLL_Message_Out@4
0 _MYDLL_Return_MACAddress@0
0 _MYDLL_TestProgram_Status@4
0 _ClientScanMAC@4 它们都一样的,前面的数字表示该函数在dll中的相对序号,由于BCB中的函数是按顺序下来的,所以它全为0。
还有,我用另外一个方法编写了这个dll,没有用类,结果ok,可以编译执行。我也用该工具看了它的汇出函数,内容都是一样的。 结果一样,为什么会发送LINK错误???
请看我用工具抓到的结果: 在VC中的
5 _MYDLL_Message_Out@4
2 _MYDLL_Client_Init@0
0 _MYDLL_ClientClose@0
6 _MYDLL_Return_MACAddress@0
3 _MYDLL_Client_Status@0
7 _MYDLL_TestProgram_Status@4
4 _MYDLL_GetMACInfo@12
1 _MYDLL_ClientGetInfo@8
8 _ClientScanMAC@4 在BCB中:
0 _MYDLL_ClientClose@0
0 _MYDLL_ClientGetInfo@8
0 _MYDLL_Client_Init@0
0 _MYDLL_Client_Status@0
0 _MYDLL_GetMACInfo@12
0 _MYDLL_Message_Out@4
0 _MYDLL_Return_MACAddress@0
0 _MYDLL_TestProgram_Status@4
0 _ClientScanMAC@4 它们都一样的,前面的数字表示该函数在dll中的相对序号,由于BCB中的函数是按顺序下来的,所以它全为0。
还有,我用另外一个方法编写了这个dll,没有用类,结果ok,可以编译执行。我也用该工具看了它的汇出函数,内容都是一样的。 结果一样,为什么会发送LINK错误???难道BCB不能接受用类编写的DLL???/
虽然都是C++语言,但VC和BCB对C++类的实现是不一样的,BCB要想调用VC写的DLL,则该DLL必须输出标准的WINAPI调用模式的函数,BCB才能懂得如何去调用该函数。你说的输出类的DLL应该是VC的扩展DLL,不是标准DLL,只能由VC写的程序自己调用。
创建远程线程的步骤:
1、找到目标(宿主)进程
2、打开该进程,在该进程地址空间内申请一块空间
3、向该空间内写入你的代码
4、调CreateRemoteThread创建远程线程(运行于宿主进程空间内,线程函数就是你写入的代码)然后,你想干什么就干什么吧,呵呵。
当然,还有很多细节,需要你自己慢慢研究滴......
我觉的 earthquake(earthquake)说的很有道理!一个是MFC为基础的,一个是以VCL为基础的!想通用的话必须编译成通用格式,特别是VCL是PASCAL语言为基础的,所以有很多不通用的地方。你这样试试
不用隐式方式调用,用LOADLIBRARY显式方式看看也不行吗??如果行,你就重点处理一下LIB文件再试试。
我就是因为前几天看到了这个类似的网文,想仔细研究一下,结果不成功:)
进行到第4步也成功了,被注入的进程只是多了个DLL调用而已,并没有达到执行程序的目的啊,
DLL被加载了,DLLMAIN返回后就没戏了,所以想让DLL做我们想干的事儿,必须在DLLMAIN中启动一个类似UI的具有消息循环的线程才行,但是我怎么试试都不行,在DLLMAIN执行一个普通和函数还可以,但一涉及到AfxBeginThread这个函数,主调程序就没界面了????什么原因??不明白:(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
你的远程线程是怎么写得?
把流程写出来,用伪代码也可以
{
OutputDebugString("Dllmain create this thread\n");
return 0;
}BOOL APIENTRY DllMain(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
DWORD dwTID;
HANDLE hThread;
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
hThread = CreateThread(NULL, 0, Thread, 0, 0, &dwTID);
CloseHandle(hThread);
} return TRUE;
}如果把if (ul_reason_for_call == DLL_PROCESS_ATTACH)换成
if (ul_reason_for_call == DLL_THREAD_ATTACH)则界面死掉。分析:
你是创的远程线程,在远程线程中动态加载DLL,这时系统不会用DLL_PROCESS_ATTACH来调dllmain,而是DLL_THREAD_ATTACH。
#include "一个从 CWinThread 派生出来的类,有消息循环 .h" DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
switch()
{
case DLL_PROCESS_ATTACH:
AfxBeginThread(RUNTIME_CLASS(一个从 CWinThread 派生出来的类,有消息循环 ));
.....
}
return ;
}//远程线程
main()
{
1. hRemProcID=用toolhelp找到explorer.exe ID;
2. 目标句柄=OpenProcess(hRemProcID);
3. 远程内存=VirtualAllocEx(目标句柄,len("c:\\MyDllFile.dll"));
4. 将"c:\\MyDllFile.dll"写入“远程内存”;
5. 找到 LoadLibraryW 函数的入中地址;
6. 启动远程线程;
return true;
}
在第6步时,DLL就会被导入远程进程中,但是如果不在DLLMAIN中启动新线程,等DLLMAIN返回后 我实在想不出再怎样调用我们自己设计的函数!
(难道还可以加个第7步(启动MyDllFile中的MyFun),自己猜的)
AfxBeginThread();这个函数有两个用法,其中一个就是用来创建用启界面线程的!我现在不敢用CreateThread这个函数,主要还不会用它来调用 基于MFC的函数(没看明白 RUNTIME_CLASS 这个宏。)你用CreateThread时传给它什么参数?是把InitInstance()传给它了吗??
{
switch()
{
case DLL_PROCESS_ATTACH: // 可能问题出在这里,这个分支不会走到,因为从线程动态加载dll时,系统不会用DLL_PROCESS_ATTACH来调用dllmian
AfxBeginThread(RUNTIME_CLASS(一个从 CWinThread 派生出来的类,有消息循环 ));
.....
}
return ;
}
::CreateThread(
NULL, // default security attributes
0, // use default stack size
ThreadFunc1, // thread function
NULL, // argument to thread function
0, // use default creation flags
NULL); // returns the thread identifier
~~~~~~~~~~~~~
}
{
AfxBeginThread(RUNTIME_CLASS(CDllFun));
}
else if (dwReason == DLL_PROCESS_DETACH)
{ }
else if (dwReason == DLL_THREAD_ATTACH)
{ // AfxBeginThread(RUNTIME_CLASS(CDllFun));
}
return 1; // ok
}这是我的源码(用MFC AppWizard(DLL)建的)让我删了一些注解和断言,两个地方我都用了!可不好用啊,下断点后,F10一过后,AfxBeginThread(RUNTIME_CLASS(CDllFun));就不返回了!
不过在任务管理器中可以看到这个程序有两个进程了!(莫名其妙)
你可以试试,不麻烦,我现在用普能的EXE文件调用,也不行!(EXE文件没界面了)我的验证思路是这样的:
建一个EXE对话框;
建一个DLL文件,加入一个对话框类;
在DLLMAIN中启动一个UI线程,显示DLL中的对话框 AfxBeginThread(RUNTIME_CLASS(CDllFun));。EXE文件调用,显示两个对话框。谢谢两位帮助!:)
DLLMAIN(...)
{
...
Class obj;
obj.InitInstance() //是这样?
...
}
下面的代码你可以试试,我这里是成功了的。
// 线程函数,用于显示对话框
ULONG WINAPI Thread(void *)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()); CMyDlg obj;// 对话框类 obj.DoModal(); return 0;
}// dll的初始化函数
BOOL CAfxdllApp::InitInstance()
{
// TODO: Add your specialized code here and/or call the base class
::CreateThread(NULL, 0, Thread, 0, 0, NULL);
return CWinApp::InitInstance();
}
在DLLMAIN中怎么个调用法?涉及到SDK+MFC我就发怵// 线程函数,用于显示对话框
ULONG WINAPI Thread(void *)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()); CMyDlg obj;// 对话框类 obj.DoModal(); return 0;
}// dll的初始化函数
BOOL CAfxdllApp::InitInstance()
{
// TODO: Add your specialized code here and/or call the base class
::CreateThread(NULL, 0, Thread, 0, 0, NULL);
return CWinApp::InitInstance();
}
///////////////////////////////////////////////
DLLMAIN(...)
{
...
case DLL_PROCESS_DETACH :
{
CAfxdllApp obj;
obj.InitInstance() //是这样?
}
...
}
///////////////////////////////////////////////
能把你的实验工程文件打包送给我吗?
我看看。.cn