问题
这个问题是这样出现,alljoyn的chat sample写得很简单,但是我移植到mfc application的时候就是出错
1
2 3 4 5 |
/* Register signal handler */
status = bus. RegisterSignalHandler ( this, static_cast <MessageReceiver :: SignalHandler > ( &ChatObject :: ChatSignalHandler ), chatSignalMember, NULL ) ; |
以上一段代码,返回是结果是invalidate argument,但是问题是这个代码在原project当中,可是可以运行的啊。
过程
这个解决问题的过程实在是有很大的问题,有点漫无目的走,这个跟自己做事情有关系,就是做得不完美。
1)首先想到的是试试用console application,看看是不是有问题?结果一样存在
2)然后想着确保所有的visual studio 2012的选项都是一致的,结果还是一样存在(但是这一步是有问题的)
3)最后想着把alljoyn的源码拿到,自己编译,看看为毛同样的代码,我自己的sample调用就会出错,耗了1~2个小时搞定。
最后发现居然是产生的汇编代码都不一致。
00AEBC35 6A
00
push
0
00AEBC37 8B 45 EC mov eax , dword ptr [ this ]
00AEBC3A 8B 48 1C mov ecx , dword ptr [ eax + 1Ch ]
00AEBC3D 51 push ecx
00AEBC3E 68 CE 95 AD 00 push 0AD95CEh
00AEBC43 8B 55 EC mov edx , dword ptr [ this ]
00AEBC46 52 push edx
00AEBC47 8B 4D 08 mov ecx , dword ptr [bus ]
00AEBC4A E8 B9 FE FE FF call ajn ::BusAttachment ::RegisterSignalHandler ( 0ADBB08h )
00AEBC37 8B 45 EC mov eax , dword ptr [ this ]
00AEBC3A 8B 48 1C mov ecx , dword ptr [ eax + 1Ch ]
00AEBC3D 51 push ecx
00AEBC3E 68 CE 95 AD 00 push 0AD95CEh
00AEBC43 8B 55 EC mov edx , dword ptr [ this ]
00AEBC46 52 push edx
00AEBC47 8B 4D 08 mov ecx , dword ptr [bus ]
00AEBC4A E8 B9 FE FE FF call ajn ::BusAttachment ::RegisterSignalHandler ( 0ADBB08h )
而自带的sample所产生的代码是:
00FD8B29 6A
00
push
0
00FD8B2B 8B 45 EC mov eax , dword ptr [ this ]
00FD8B2E 8B 48 1C mov ecx , dword ptr [ eax + 1Ch ]
00FD8B31 51 push ecx
00FD8B32 8B 95 08 FF FF FF mov edx , dword ptr [ ebp - 0F8h ]
00FD8B38 52 push edx
00FD8B39 8B 85 04 FF FF FF mov eax , dword ptr [ ebp - 0FCh ]
00FD8B3F 50 push eax
00FD8B40 8B 4D EC mov ecx , dword ptr [ this ]
00FD8B43 51 push ecx
00FD8B44 8B 4D 08 mov ecx , dword ptr [bus ]
00FD8B47 E8 44 14 04 00 call ajn ::BusAttachment ::RegisterSignalHandler ( 01019F90h )
00FD8B4C 89 45 E0 mov dword ptr [status ] , eax
00FD8B2B 8B 45 EC mov eax , dword ptr [ this ]
00FD8B2E 8B 48 1C mov ecx , dword ptr [ eax + 1Ch ]
00FD8B31 51 push ecx
00FD8B32 8B 95 08 FF FF FF mov edx , dword ptr [ ebp - 0F8h ]
00FD8B38 52 push edx
00FD8B39 8B 85 04 FF FF FF mov eax , dword ptr [ ebp - 0FCh ]
00FD8B3F 50 push eax
00FD8B40 8B 4D EC mov ecx , dword ptr [ this ]
00FD8B43 51 push ecx
00FD8B44 8B 4D 08 mov ecx , dword ptr [bus ]
00FD8B47 E8 44 14 04 00 call ajn ::BusAttachment ::RegisterSignalHandler ( 01019F90h )
00FD8B4C 89 45 E0 mov dword ptr [status ] , eax
最后总算发现了,验证compiler option一样的时候,忘记看那个addtional option了,然后addtional option当中使用了
mm
mg的选项,这两个选项导致了,
这种奇怪的4个参数,push 5个数据进去的情况。
总结
解决问题要抓住核心和本质,比如讲这个问题的核心就是两个版本一个版本行,另外一个版本不行,惟一的可能性就是编译选项的问题,比如讲我为何这么挫就是没有钱的原因。
这种奇怪的4个参数,push 5个数据进去的情况。
总结
解决问题要抓住核心和本质,比如讲这个问题的核心就是两个版本一个版本行,另外一个版本不行,惟一的可能性就是编译选项的问题,比如讲我为何这么挫就是没有钱的原因。