[英]Thread design and design and calling a function in one thread from another in C++ Win32
[英]C++/Win32 Dynamically calling a function without knowing its signature
这是一个糟糕的主意,但我正在走这条路之前,看看是否可行。
我必须编写一个Win32 C ++程序,该程序可以基于文件动态加载库,该文件包含有关要使用的dll,函数,签名和争论的序列化信息。 加载库很简单(LoadLibraryEx工作正常)。 然后,获得函数指针很容易(没什么大不了的,GetProcAdderss会解决这个问题)。 然而,其余的都是棘手的。
这是我的攻击计划,如果这不是最好的方法,请随时告诉我:
请记住我的限制:
有没有更好的方法,这种方法还能行吗?
更新
对于来此线程学习更多信息的任何人,我都找到了解决方案。 在C语言中,您可以使用dlopen动态加载库(此库有一个Winlib以便于使用)。 加载后,您可以使用libffi(支持mac / ios / win 64和32位)动态执行函数。 这只会带您进入C函数和原始类型(指针,uint,int,double,float),也就是关于它。 但是,使用macosx Objective-C桥,您可以通过加载libobjc(将OSX的本机obj-c转换为c“免费电话”桥)来访问Objective-c。 然后通过它动态创建obj-c和c ++类。 可以使用C#及其封送处理功能在Windows上完成类似的技术。
这最终会产生高开销,并且您必须非常注意内存,此外,请勿混合使用C / C#/ C ++的指针。 最后,无论您做什么,在运行时。 绝对要确保您知道自己的类型。 顺便说一句,libffi / cinvoke,令人惊叹的库。
现有的库可以满足您的描述,例如C / Invoke:
一般规则是,如果您有一个糟糕的主意,请将其删除并找到一个好的主意。
如果根本不知道签名,那么您描述的内容就会浮出水面。 假设您的呼叫对我的功能有效。 我将函数从__stdcall更改为__cdecl或返回,您将崩溃。
同样,您不处理退货。
如果您放松“未知”以允许一些限制,例如修复返回类型和调用约定,那么您会领先一些-那么您确实可以模拟该调用,但是这样做有什么用呢? 整个过程听起来像是一个自助式hack-me引擎。
通常的方法是发布一些固定的接口(使用函数签名),并使DLL支持它。 或安排一些统一的数据传输机制。
我建议您描述自己的真正追求,然后在Programmers SE上发问。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.