最近遇到的3个TT问题

Fireway2008 2010-05-10 09:35:04
各位高手,本人最近在编程的时候,遇到三个棘手的问题,反复调试都不得力,如下:
(注:调试环境为Windows XP SP2,VC6.0)


1. 关于DLL的改名调用疑问
本人利用MFC Regular DLL 创建了一个工程,命名为 TestDLL
之后,在里边引入3个函数。

在Debug模式下
编译后得到:
TestDLL.h TestDLL.dll TestDLL.lib
然后,在某个对话框工程内引入这个DLL,
用隐式调用的方式(对应EXE工程内插入TestDLL.h 和 TestDLL.lib进行编译)
运行的时候,对应的exe和TestDLL.dll放在同一个地方,结果运行正常。

现在,为了方便区别
Debug 生成的 DLL
和Release下生成的DLL.
我希望把TestDLL.dll 改名为 TestDLL_D.dll之后,
对应的exe和TestDLL_D.dll放在同一个地方,一样可以正常地让exe调用,请问怎么做呢?
是不是要更改MFC DLL工程内 def 文件才行?


否则,运行exe的时候将出现错误提示:
没有找到TestDLL.dll,因此这个程序未能启动……


2. 关于GDI+无法调用的疑问

请点击如下链接:
绿玻璃界面

本人参与过这个工程的修改,也实现了效果。但是,前不久我在整理系统,卸载了许多程序。
后来再次想调试它的时候,发现半透明的窗体背景没了,而我也没怎么改动文件。
让别人调试我的工程,一切正常!太诡异了吧@@!


本人猜想,是不是GDI+对操作系统有特别的要求?

3. 在XP/2K内隐藏进程的疑问

请点击如下链接:
[分享]在2000和xp下隐藏进程


本人在自己的系统编译调试,无奈还是没能实现隐藏,
不晓得是不是系统打了漏洞补丁后的结果;
或是那的代码自己本来就无法实现隐藏进程?


请名位有经验者支持一下!
...全文
321 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
Fireway2008 2010-05-18
  • 打赏
  • 举报
回复
虽然问题还是没能得到完善的解决
不过本人也从中学到不少有用的,
感谢大家的指点!
wangk 2010-05-17
  • 打赏
  • 举报
回复
既然Image是有效的,那么我只能建议你双机调试,或者1物理机器+虚拟机调试(前提是虚拟机能重现),这样可以在OnPaint之类的函数单步调试。看看计算透明区域的结果是否正确之类的。
Fireway2008 2010-05-17
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 wangk 的回复:]
image生成的是否有效?最好单步跟踪进去,以及使用Image::GetRawFormat、Image::GetWidth和Image::GetHeight测试一下图片加载是否正确。另外你用的是相对路径,因此要确认bk.png在你运行环境的路径下。
[/Quote]

经调试,有效的。
	Image image(L"bk.png", TRUE);			//GDI+中的类

int w = image.GetWidth();
int h = image.GetHeight();
int t = graph.DrawImage(&image, 0,0, 267,160);大小,否则会失真
MoveWindow(rct.left,rct.top, 267,160); //设置窗体大小和图片大小一致,无边框的对话框
//得到 w = 267 h = 154 t=0


这些说明什么问题呢?
难道真的要重装Windows系统不可 ?
Fireway2008 2010-05-14
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 lfs09 的回复:]
引用 13 楼 fireway2008 的回复:


效果网站上面的不一样啊,除了输入框和BUTTON外,背景是完全透明的
网站上面的效果不是这样的啊?
[/Quote]

背景是绿玻璃的没错,也许你也遇到了和我一样的麻烦问题……
Fireway2008 2010-05-14
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 henry3695 的回复:]
TestDll_D.dll和对应的TestDll_D.lib 拷贝到需要使用的工程里,需要再次编译才可以使用
[/Quote]

那么我在4楼的设置不是没用了?
你妹的特盗不 2010-05-13
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 fireway2008 的回复:]
引用 9 楼 lfs09 的回复:
lz 问下啊,你的那个下次玻璃那代码,我用vs2008 +xp Sp2 编译,怎么没有那效果呢?
全透明了,只有那个按钮的输入框不是透明的了


CEdit框 和 Button是不透明的。
[/Quote]
效果网站上面的不一样啊,除了输入框和BUTTON外,背景是完全透明的
网站上面的效果不是这样的啊?
我看你有戏 2010-05-12
  • 打赏
  • 举报
回复
TestDll_D.dll和对应的TestDll_D.lib 拷贝到需要使用的工程里,需要再次编译才可以使用
Fireway2008 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 wangk 的回复:]
关于问题1,我记得只要工程设定好就可以了,你可以去参考CxImage的Dll工程配置,它Debug和Release是不同的lib和Dll。

是你的某些设定没有正确而已。


关于问题2,建议你在你自己写的空间和处理图片组件代码里,多加一些ASSERT的判断,而不是用容错性编程,这样比较有利于Debug
[/Quote]
1. 我能生成得到不同的名的DLL LIB文件,但给EXE调用的时候就没则了……

2. 真不知道在哪里加ASSERT为好,请帮标一下,主要代码如下:

BOOL CTestApp::InitInstance()
{
AfxEnableControlContainer();
IsSupportGDIPlus();
GdiplusStartupInput gdiplusStartupInput;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
……


BOOL CTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
……
// TODO: Add extra initialization here
//初始化GDI+.
m_Blend.BlendOp=0; //theonlyBlendOpdefinedinWindows2000
m_Blend.BlendFlags=0; //nothingelseisspecial...
m_Blend.AlphaFormat=1; //...
m_Blend.SourceConstantAlpha=255;//AC_SRC_ALPHA

//窗体样式为0x80000为层级窗体
DWORD dwExStyle=GetWindowLong(m_hWnd,GWL_EXSTYLE);
SetWindowLong(m_hWnd,GWL_EXSTYLE,dwExStyle^0x80000);

//绘制内存位图
//HDC hdcTemp=GetDC()->m_hDC;
CDC* pDC = GetDC();
//m_hdcMemory=CreateCompatibleDC(hdcTemp);

m_hdcMemory=CreateCompatibleDC(pDC->m_hDC);
//HBITMAP hBitMap=CreateCompatibleBitmap(hdcTemp,500,500);

HBITMAP hBitMap=CreateCompatibleBitmap(pDC->m_hDC, 500,500);
SelectObject(m_hdcMemory, hBitMap);
::DeleteObject(hBitMap);
//::DeleteDC(hdcTemp);
ReleaseDC(pDC);

//使用GDI+载入PNG图片
HDC hdcScreen=::GetDC(m_hWnd);
RECT rct;
GetWindowRect(&rct);
POINT ptWinPos={rct.left, rct.top};
Graphics graph(m_hdcMemory); //GDI+中的类
Image image(L"bk.png", TRUE); //GDI+中的类
graph.DrawImage(&image, 0,0, 267,160); //后面两个参数要设置成跟图片一样大小,否则会失真
MoveWindow(rct.left,rct.top, 267,160); //设置窗体大小和图片大小一致,无边框的对话框

//使用UpdateLayerWindow进行窗口透明处理
HMODULE hFuncInst=LoadLibrary("User32.DLL");
typedef BOOL (WINAPI *MYFUNC)(HWND, HDC, POINT*, SIZE*, HDC, POINT*, COLORREF, BLENDFUNCTION*, DWORD);
MYFUNC UpdateLayeredWindow;
UpdateLayeredWindow=(MYFUNC)GetProcAddress(hFuncInst, "UpdateLayeredWindow");
SIZE sizeWindow={267, 160};
POINT ptSrc={0, 0};
UpdateLayeredWindow( m_hWnd, hdcScreen, &ptWinPos, &sizeWindow, m_hdcMemory, &ptSrc, 0, &m_Blend, 2);
GetWindowRect(&m_oldRect); //记录窗体初始化大小的位置

::ReleaseDC(m_hWnd, hdcScreen);
::FreeLibrary(hFuncInst);
return TRUE; // return TRUE unless you set the focus to a control
}
wangk 2010-05-11
  • 打赏
  • 举报
回复
关于问题1,我记得只要工程设定好就可以了,你可以去参考CxImage的Dll工程配置,它Debug和Release是不同的lib和Dll。

是你的某些设定没有正确而已。


关于问题2,建议你在你自己写的空间和处理图片组件代码里,多加一些ASSERT的判断,而不是用容错性编程,这样比较有利于Debug

Fireway2008 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 ringphone 的回复:]
关于问题1,我记得这是跟工程名有关,你需要分两个工程,加入相同的文件,不同的DEF,不同的输出文件名。
[/Quote]

也就是说,在同一工程下,我的想法不能实现了?

另外,GDI+ COM组件的缺乏,有什么好的调试或查看方法吗?
ringphone 2010-05-11
  • 打赏
  • 举报
回复
关于问题1,我记得这是跟工程名有关,你需要分两个工程,加入相同的文件,不同的DEF,不同的输出文件名。
mcaok 2010-05-11
  • 打赏
  • 举报
回复
帮顶一下。
wangk 2010-05-11
  • 打赏
  • 举报
回复
关于问题1,CxImage的Dll可以被正确导向,Debug的cximaged.lib链接Debug的cximaged.Dll,Release的cximage.lib链接Debug的cximage.Dll。

所以我认为是你工程属性配置的问题,你的“能生成得到不同的名的DLL LIB文件”解释无意义,它不代表你工程属性正确,你生成的TestDLL_D.lib里面仍然指向TestDLL.dll,就像直接改名TestDLL.lib一样。


// 这里开始要注意
Image image(L"bk.png", TRUE); //GDI+中的类


image生成的是否有效?最好单步跟踪进去,以及使用Image::GetRawFormat、Image::GetWidth和Image::GetHeight测试一下图片加载是否正确。另外你用的是相对路径,因此要确认bk.png在你运行环境的路径下。
jyh_baoding 2010-05-10
  • 打赏
  • 举报
回复
以上大家说的都有道理
wangk 2010-05-10
  • 打赏
  • 举报
回复

1.Exe也要重新引用TestDLL_D.lib并重新编译。

2.gdiplus.dll本身可以不用注册就使用,但是它会根据文件类型调用COM组件解析,所以要看你的资源的格式。因此断点在你的资源加载的时候看看处理的时候在哪里出现问题。

3.参考文章:直接修改内核对象隐藏进程
Fireway2008 2010-05-10
  • 打赏
  • 举报
回复
To 其它楼层的仁兄们:

1. 我保证输出路径是对的


2. GDI依赖的库等被卸载了?应该不可能吧,我的工程文件包内有所有的GDI+的必要文件。


3. 希望有实例参考,因为我对驱动不熟悉。
jameshooo 2010-05-10
  • 打赏
  • 举报
回复
1、恐怕改DEF文件是必须的,你可以制作两个DEF文件,使用不同的库名,分别用于DEBUG和RELEASE版。

2、调试一下GDI+调用的返回状态

3、以前做过98和2000的进程隐藏,VISTA下不灵,后来没再做过。估计是操作系统的限制越来越严。
Fireway2008 2010-05-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wangk 的回复:]
1.改名要在工程的link->输出中改,这样lib里面的链接的Dll名才会匹配
2.恐怕是某个COM组件被你卸载了,你最好要调试看看那个组件初始化不成功
3.使用了系统的一个映射内存操作系统内存的漏洞,应该是你打了补丁的结果。
如果要隐藏进程建议你还是写驱动,这种Ring3直接操作Ring0的行为以后的系统很难兼容。
[/Quote]
谢谢这位仁兄!

1. 我在Project Setting Link内,已经做了修改:

将TestDLL目录下的TestDLL.def文件复制一份为TestDLL_D.def
将TestDLL_D.def中的
LIBRARY "TestDLL" 改为 LIBRARY "TestDLL_D" 保存

Project Settings/Link
Settings For 选Win32 Debug
Output file name 改为
../OutPut/TestDLL_D.dll

Project Options:最后三句改为
/machine:I386 /def:".\TestDLL_D.def"(决定有效的DEF件)
/out:"../OutPut/TestDLL_D.dll"
/implib:"../lib/TestDLL_D.lib" /pdbtype:sept


然后重新编译,但是EXE调用的时候,错误提示还在……


2. 具体哪一个,遍历地找起来恐怕有点难度哦……

根据您的经验,有什么好的查找方法吗?
GDI+一定和特定的COM 相关吧。


3. 看来也还是要写驱动…… 有没有实例参考一下?
visualassist4680 2010-05-10
  • 打赏
  • 举报
回复
1. debug->link 输出文件名,修改 输出路径和名称
2. 是不是 gdiplus.dll 被卸载了,或者版本不对
3. 还是用驱动隐藏比较保险些,代码已经失效
oyljerry 2010-05-10
  • 打赏
  • 举报
回复
1.工程属性中link的lib文件要修改成对应的lib文件
2.估计GDI依赖的库等被卸载了
3.2000版本的,应该是系统漏洞,补丁修复了
加载更多回复(11)

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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