VS2005编译的exe引用VS2012编译的dll

yingzi566 2016-04-24 07:47:19
VS2005编译的exe引用VS2012编译的dll,VS的 framework不同,这样可以吗?
我这样做后,64位的程序没有问题。32位的程序有问题,dll中一个矩形的值,exe中获取到的变了(地址偏移)。获取值是通过传指针实现的。

exe中:
RECT tmpRect;
GetRect(&tmpRecct);

dll中:
void GetRect(Rect * dirtyRect )
{
...
dirtyRect->left = 0;
dirtyRect->top = 0;
dirtyRect->right = 1440;
dirtyRect->bottom = 900;
......
}
在exe获取到的矩形,变成了(0,0,0,1440)。如果循环赋值调用变形大概如下:
(0,221,64,24)------------>(0,0,221,64)
(22,55,77,88)------------>(0,22,55,77)
(55,554,2,32)------------>(0,55,554,2)
第一个值不知道获取的哪个地址,这可能是什么问题造成的?需要设置什么编译选项吗?
急,在线等。
...全文
193 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-04-28
  • 打赏
  • 举报
回复
引用 12 楼 yingzi566 的回复:
我知道什么原因了,结贴。 dll 中定义的调用规约是__cdecl, 但是我exe里定义函数指针时,指定的 PASCAL *。互相矛盾。 导致各种诡异的现象。真是血的教训啊。
调用约定 https://msdn.microsoft.com/zh-cn/magazine/9b372w95.aspx 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! 不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他!) VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
yingzi566 2016-04-27
  • 打赏
  • 举报
回复
引用 10 楼 Dobzhansky 的回复:
两边理解的内存布局不一致, exe 是 RECT, dll 是 Rect , 是拼写错误吗 两边分别看一下 sizeof 等于多少。 看样子 Rect 有虚函数哦
谢谢回答。 是拼写错误,两个都是RECT。 RECT是一个结构体啊,结构体没有虚函数的吧。
yingzi566 2016-04-27
  • 打赏
  • 举报
回复
我知道什么原因了,结贴。 dll 中定义的调用规约是__cdecl, 但是我exe里定义函数指针时,指定的 PASCAL *。互相矛盾。 导致各种诡异的现象。真是血的教训啊。
Dobzhansky 2016-04-26
  • 打赏
  • 举报
回复
两边理解的内存布局不一致, exe 是 RECT, dll 是 Rect , 是拼写错误吗 两边分别看一下 sizeof 等于多少。 看样子 Rect 有虚函数哦
yingzi566 2016-04-26
  • 打赏
  • 举报
回复
引用 8 楼 fhw_bin_dl 的回复:
VS2012的平台工具集选 XP 试试。
不行
赵4老师 2016-04-25
  • 打赏
  • 举报
回复
分别生成和使用32位和64位的dll
fhw217 2016-04-25
  • 打赏
  • 举报
回复
VS2012的平台工具集选 XP 试试。
赵4老师 2016-04-25
  • 打赏
  • 举报
回复
拆成多句,再设断点。 或者写日志到文件。
yingzi566 2016-04-25
  • 打赏
  • 举报
回复
引用 1 楼 WUYUAN2011WOAINI 的回复:
跟到dll中调试一下就知道了
并不是那么好调试的。一些变量的的值跟踪不到,赋值的地方断点都设不了。
yingzi566 2016-04-25
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
分别生成和使用32位和64位的dll
是分别生成和引用的。使用dll的方式是动态load。(Loadlibrary()) 然而并不行啊。
kuankuan_qiao 2016-04-24
  • 打赏
  • 举报
回复
跟到dll中调试一下就知道了

16,473

社区成员

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

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

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