Windows Mobile DLL的DLL HMODULE

Windows Mobile DLL的DLL HMODULE,dll,windows-mobile,Dll,Windows Mobile,我正在为Windows Mobile 6.x创建一个DLL。我需要获得我自己的DLL的HMODULE,但到目前为止我还没有成功。对于标准Windows DLL,这似乎非常简单,因为DllMain签名是: booldllmain(HMODULE、DWORD、LPVOID) 您只需获取第一个参数并将其保存在全局变量中。但是,Windows Mobile DLL的签名是(出于我不理解的原因): booldllmain(HANDLE、DWORD、LPVOID) 在这种情况下,从何处或如何获取DLL的HM

我正在为Windows Mobile 6.x创建一个DLL。我需要获得我自己的DLL的HMODULE,但到目前为止我还没有成功。对于标准Windows DLL,这似乎非常简单,因为
DllMain
签名是:

booldllmain(HMODULE、DWORD、LPVOID)

您只需获取第一个参数并将其保存在全局变量中。但是,Windows Mobile DLL的签名是(出于我不理解的原因):

booldllmain(HANDLE、DWORD、LPVOID)

在这种情况下,从何处或如何获取DLL的HMODULE? 非常感谢您的回答。

该句柄是HMODULE。它们都是从
void*
键入的

编辑

我刚刚测试了这个,它按预期工作:

#include "windows.h"


BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    HMODULE module = (HMODULE)hModule;
    RETAILMSG(TRUE, (_T("module = 0x%08x\r\n", module));

    return TRUE;
}
这个手柄就是HMODULE。它们都是从
void*
键入的

编辑

我刚刚测试了这个,它按预期工作:

#include "windows.h"


BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    HMODULE module = (HMODULE)hModule;
    RETAILMSG(TRUE, (_T("module = 0x%08x\r\n", module));

    return TRUE;
}

不,它们不在Windows Mobile SDK中。winnt.h的摘录:
typedef void*HANDLE#定义DECLARE_HANDLE(name)struct name 35;#_{int unused;};typedef struct name 35;#*name
和来自windef.h:
声明句柄(HINSTANCE);typedef-HINSTANCE-HMODULE此代码在编译期间抛出错误:
HMODULE模块;把手;模块=手柄
From:“DLL的HINSTANCE与DLL的HMODULE相同,因此hinstDLL可用于对GetModuleFileName函数和其他需要模块句柄的函数的后续调用。”。虽然它不遵循C或C++规则,但很可能安全地在这两种类型之间进行转换。基于结构的声明是为了防止代码意外地执行此操作(例如将HWND与句柄混淆)。请您澄清我应该如何强制转换?使用两个模块=(HMODULE)句柄;和模块=重新解释铸件(手柄);我在模块中的值为NULL,而句柄不是NULL。@如果是这样的话,我会非常惊讶,尽管这是可能的。我希望这两种方法都能奏效。我在某些优化中看到过类似的行为(编译器可以自由地假设不相关类型之间没有别名),但这是gcc的行为,而不是MSVC的行为。如何确定模块为NULL而句柄不是NULL?你确定那是对的吗?你试过拆卸德尔曼吗?如果代码生成器确实是问题所在,那么您可以通过使用联合双关(或禁用该类优化)来解决它。不过我还是会很惊讶,我和洛根在一起。我只是直接播放,我从未见过失败。不,它们不在Windows Mobile SDK中。winnt.h的摘录:
typedef void*HANDLE#定义DECLARE_HANDLE(name)struct name 35;#_{int unused;};typedef struct name 35;#*name
和来自windef.h:
声明句柄(HINSTANCE);typedef-HINSTANCE-HMODULE此代码在编译期间抛出错误:
HMODULE模块;把手;模块=手柄
From:“DLL的HINSTANCE与DLL的HMODULE相同,因此hinstDLL可用于对GetModuleFileName函数和其他需要模块句柄的函数的后续调用。”。虽然它不遵循C或C++规则,但很可能安全地在这两种类型之间进行转换。基于结构的声明是为了防止代码意外地执行此操作(例如将HWND与句柄混淆)。请您澄清我应该如何强制转换?使用两个模块=(HMODULE)句柄;和模块=重新解释铸件(手柄);我在模块中的值为NULL,而句柄不是NULL。@如果是这样的话,我会非常惊讶,尽管这是可能的。我希望这两种方法都能奏效。我在某些优化中看到过类似的行为(编译器可以自由地假设不相关类型之间没有别名),但这是gcc的行为,而不是MSVC的行为。如何确定模块为NULL而句柄不是NULL?你确定那是对的吗?你试过拆卸德尔曼吗?如果代码生成器确实是问题所在,那么您可以通过使用联合双关(或禁用该类优化)来解决它。不过我还是会很惊讶,我和洛根在一起。我只是直接投了,我从未见过失败。