我是c ++和Access的新手。我正在使用Access调用dll(由c ++编译)的项目。 我想了解参数如何传递到dll。
dll的输入数据是在Access中准备的,我们从Access调用dll。 我们将“RunFunction”与我们想要调用的dll相关联。 Access中的行调用dll:
List
符合dll的cpp代码:
Grid
第一个问题,从cpp代码中,我发现* iData(在c ++中)实际上包含来自Data(在Access中)的所有信息。 为什么会发生?我以为只有Data.age被传递到* iData,而不是整个数据?
第二个问题,来自Access的RunFunction有四个输入参数,而c ++只需要三个,为什么它不会导致任何问题?
答案 0 :(得分:1)
首先,考虑在Access中,Data.age
的值可能位于包含整个记录或其他结构的缓冲区内。因此,当在C ++中将该值的地址传递给您时,您可以浏览相邻地址并查看其中的内容。不要那样做!
其次,看看__stdcall
的工作方式。它是在C的早期设计的,当时根本没有检查函数参数!您可以在调用者端传递更少或更多的参数,而不是弄乱堆栈。如果你通过额外的,没什么大不了的。如果你省略一些,那么使用函数中最右边的名称将给出垃圾值,而 witing 会导致各种问题,包括破坏返回地址。