springboot分模块用什么调用

springboot分模块用什么调用,第1张

这个是微软一个很诡异的设计。如果你要使用LoadString获得在动态连接库的资源中保存的String,那么你不能用GetModuleHandle(NULL)来获得模块句柄,因为这个函数会返回调用你这个DLL的主程序的句柄,而LoadString需要你提供你要加载的字符串所在的那个模块的句柄,如果你是加载EXE的中的字符串,则用GetModuleHandle,如果是DLL的字符串,就稍微有点复杂了,要分两种情况讨论:

首先,如果你使用Micorosft Visual Studio 2003(VC 6是否支持我不确定,因为实在太老了)以上的版本,那非常好,你自己写这么一个函数即可:

#include <windowsh>

extern IMAGE_DOS_HEADER __ImageBase;

inline HINSTANCE GetThisModuleHandle()

{

return reinterpret_cast<HINSTANCE>(&__ImageBase);

}

之后你就这么调用LoadString

LoadString(GetThisModuleHandle(), );

在Visual Studio的编译器里面,内置了一个变量__ImageBase,他的类型是IMAGE_DOS_HEADER结构体,这个结构体是每个EXE或者DLL文件的一开始的数据结构,而Windows的HINSTANCE事实上就是加载这个模块在内存空间中的首地址,所以正好__ImageBase的地址就是该模块的HINSTANCE的值,这样你直接转换即可。这种方法是可靠的,MSDN里面很多例子都是用这样的方式获取句柄。

如果你不想这么做或者你的编译器很老不支持__ImageBase,那么这个问题就变得比较复杂了。

1 如果你能保证,你的DLL一定是动态加载的,也就是通过LoadLibrary方式加载,不是通过编译的时候嵌入lib文件的方式加载的,那么你只需要在DllMain函数中,将第一个HMODULE参数保存下来就行了。HMODULE和HINSTANCE由于16位Windows历史的原因存在,这两个类型在32位Windows下是相同的。这种方法无法用在通过lib链接的方式链接的DLL,因为这种加载DLL的方式DllMain不会被调用。

2 现在问题就非常棘手了,微软没有再提供什么可行性很高的方法来获得DLL的句柄,一种方法是通过DLL的文件名来获得,将DLL的文件名传递给GetModuleHandle,可以获得DLL的句柄,这个方法看似简单但不可靠,你必须将文件名在程序里面写死,这样一来,如果你时候改变DLL文件名称的话,GetModuleHandle调用就会失败。

综上所述,推荐用__ImageBase的方法,微软自己的标准方法。

其实不仅是LoadString,什么LoadCursor,Load等一堆函数都要提供资源所在的模块句柄,以上方法都适用。

以上就是关于springboot分模块用什么调用全部的内容,包括:springboot分模块用什么调用、netware 怎么调用 长文件名模块、急急!!!VC 非MFC动态库工程下,调用LoadString函数怎么获得模块句柄等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10149167.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存