小编Ste*_*ett的帖子

如何从MFC程序写入stdout?

MFC程序通常无法写入stdout.MFC在启动期间使用stdout/stdin管道做了一些奇怪的事情,你写的任何内容(例如,执行printf("hello");)只是转到/ dev/null.

有谁知道如何从MFC程序成功写入stdout?

谢谢阅读.

c++ mfc stdout

10
推荐指数
5
解决办法
2万
查看次数

我正在使用DefineClass()从C定义一个Java类,但得到UnsatisfiedLinkError

我正在使用JNI调用DefineClass()从C定义一个java类,然后我注册本机类中的方法的本机回调.该类有两个静态方法,两者都是本机方法.我使用RegisterNatives()来注册本机函数.两个电话都成功了

但是当我从我的Java代码中引用这些本机方法时,我得到java.lang.UnsatisfiedLinkError myPackage.myClass.myMethod(I)V

但是我知道DefineClass为myPackage.myClass返回了一个类对象,我知道myMethod(I)V已经被注册为该类的一个方法.

我得到这个失败就像它要执行main()一样 - 对我的本机方法的调用是(暂时的,用于测试).

作为测试,我尝试在同一个JNIEnv上两次调用DefineClass来查看发生了什么.我得到一个重复的类定义错误.我也尝试在定义它之后调用FindClass()并且JNIEnv返回对已定义类的引用.

因此,我是动态创建类的definity,但是当我尝试引用它的方法时它失败了.

有任何想法吗?所有输入赞赏.

平台:Windows,64位XP上的32位代码.

java java-native-interface

6
推荐指数
1
解决办法
1721
查看次数

CreateThread()在64位Windows上失败,在32位Windows上运行.为什么?

操作系统:Windows XP 64位,SP2.

我有一个不寻常的问题.我正在将一些代码从32位移植到64位.32位代码工作得很好.但是当我为64位版本调用CreateThread()时,调用失败.我有三个失败的地方.2调用CreateThread().1调用beginthreadex()调用CreateThread().

所有三个调用都失败,错误代码为0x3E6,"对内存位置的访问无效".

问题是所有输入参数都是正确的.

HANDLE  h;
DWORD   threadID;

h = CreateThread(0,            // default security
                 0,            // default stack size
                 myThreadFunc, // valid function to call
                 myParam,      // my param
                 0,            // no flags, start thread immediately
                 &threadID);
Run Code Online (Sandbox Code Playgroud)

对CreateThread()的所有三次调用都是从我在程序执行开始时注入目标程序的DLL(这是在程序到达main()/ WinMain()之前)开始的.如果我通过说菜单从目标程序(相同的参数)调用CreateThread(),它就可以工作.相同的参数等奇怪.

如果我传递NULL而不是&threadID,它仍然会失败.

如果我将NULL作为myParam传递,它仍然会失败.

我不是从DllMain()内部调用CreateThread,所以这不是问题.我很困惑,在谷歌等搜索没有显示任何相关的答案.

如果有人以前见过这个或有任何想法,请告诉我.

谢谢阅读.

回答

简短回答:x64上的堆栈帧需要16字节对齐.

更长的答案:经过多次撞击调试器墙并发布对各种建议的响应(所有这些都有所帮助,促使我尝试新方向)我开始在调用CreateThread之前探讨堆栈上的内容是什么().事实证明这是一个红鲱鱼,但它确实导致了解决方案.

向堆栈添加额外数据会更改堆栈帧对齐.迟早,其中一个测试会使您进行16字节堆栈帧对齐.那时代码工作了.所以我回溯了我的步骤并开始将NULL数据放入堆栈而不是我认为正确的值(我一直在推送返回地址来伪造一个调用帧).它仍然有效 - 所以数据并不重要,它必须是实际的堆栈地址.

我很快意识到堆栈的16字节对齐.以前我只知道数据的8字节对齐.该微软文档解释了所有对齐要求.

如果堆栈帧在x64上没有16字节对齐,则编译器可能会在将数据推入堆栈时将大(8字节或更多)数据放在错误的对齐边界上.

因此我面临的问题 - 使用未在16字节边界上对齐的堆栈调用挂钩代码.

对齐要求的快速摘要,表示为大小:对齐

  • 1:1
  • 2:2
  • 4:4
  • 8:8
  • 10:16
  • 16:16

大于8字节的任何内容在2边界的下一个幂上对齐.

我认为微软的错误代码有点误导.最初的STATUS_DATATYPE_MISALIGNMENT可以表示为STATUS_STACK_MISALIGNMENT,这将更有帮助.但随后将STATUS_DATATYPE_MISALIGNMENT转换为ERROR_NOACCESS - 这实际上掩盖并误导了问题是什么.非常无益.

感谢大家发布的建议.即使我不同意这些建议,它们也促使我在各方面进行测试(包括我不同意的方向).

写下数据类型错位问题的更详细描述:64位移植问题#1!x64数据类型未对齐.

windows 64-bit multithreading alignment 32bit-64bit

5
推荐指数
1
解决办法
4342
查看次数

Ruby on Rails版本之间的差异?我应该使用哪个?

我在2005年第一次使用Rails的时候并不是那么出名.我用它做了一些实验性的工作,但是由于时间不够而已经萎缩了.

我现在正在考虑再次坚持原始想法(使用新的实现),在研究最新的Ruby和Ruby-on_Rails版本时,我看到了Ruby 1.9.2和Rails 3.0 beta.

我还没有找到任何Rails主要版本之间差异的简明描述.我查看了官方的Rails网站以及其他一些网站.没有快乐.也许我在寻找错误的地方或错误的地方?

我的项目本质上不是商业性的(这是一个爱好的事情)所以Rails 3.0的测试版性质并没有让我失望.我想知道差异是什么.有人可以解释一下吗?

如果它对答案有任何可能性,我将在Linux盒子和/或Windows盒子上工作.

ruby ruby-on-rails

4
推荐指数
1
解决办法
1803
查看次数

如何判断当前进程是否为服务(C++,Win32)?

如何判断我的代码运行的应用程序是在服务还是应用程序中?为什么我想知道这一点 - 我正在编写一些注入目标应用程序的代码,而且代码无法预先知道这些信息,所以它必须自己解决.

我不能依赖从服务控制管理器调用的任何代码,启动,停止或命令行参数.

我正在查看GetConsoleWindow()我希望将为NULL任何应用程序(具有控制台)返回服务(无控制台)和窗口句柄.不确定这个假设有多有效.

想要更好的解决方案吗?

c++ winapi

2
推荐指数
1
解决办法
2368
查看次数