永发信息网

调用DLL命令后发现堆栈错误怎么办

答案:1  悬赏:80  手机版
解决时间 2021-02-19 04:21
  • 提问者网友:最爱你的唇
  • 2021-02-18 06:32
调用DLL命令后发现堆栈错误怎么办
最佳答案
  • 五星知识达人网友:三千妖杀
  • 2021-02-18 07:23
现在是更深入地进行探讨的时候了。在对托管代码进行 P/INVOKE 调用时,DLLIMPORTATTRIBUTE 类型扮演着重要的角色。DLLIMPORTATTRIBUTE 的主要作用是给 CLR 指示哪个 DLL 导出您想要调用的函数。相关 DLL 的名称被作为一个构造函数参数传递给 DLLIMPORTATTRIBUTE。
如果您无法肯定哪个 DLL 定义了您要使用的 WINDOWS API 函数,PLATFORM SDK 文档将为您提供最好的帮助资源。在 WINDOWS API 函数主题文字临近结尾的位置,SDK 文档指定了 C 应用程序要使用该函数必须链接的 .LIB 文件。在几乎所有的情况下,该 .LIB 文件具有与定义该函数的系统 DLL 文件相同的名称。例如,如果该函数需要 C 应用程序链接到 KERNEL32.LIB,则该函数就定义在 KERNEL32.DLL 中。您可以在 MESSAGEBEEP 中找到有关 MESSAGEBEEP 的 PLATFORM SDK 文档主题。在该主题结尾处,您会注意到它指出库文件是 USER32.LIB;这表明 MESSAGEBEEP 是从 USER32.DLL 中导出的。
可选的 DLLIMPORTATTRIBUTE 属性
除了指出宿主 DLL 外,DLLIMPORTATTRIBUTE 还包含了一些可选属性,其中四个特别有趣:ENTRYPOINT、CHARSET、SETLASTERROR 和 CALLINGCONVENTION。
ENTRYPOINT 在不希望外部托管方法具有与 DLL 导出相同的名称的情况下,可以设置该属性来指示导出的 DLL 函数的入口点名称。当您定义两个调用相同非托管函数的外部方法时,这特别有用。另外,在 WINDOWS 中还可以通过它们的序号值绑定到导出的 DLL 函数。如果您需要这样做,则诸如“#1”或“#129”的 ENTRYPOINT 值指示 DLL 中非托管函数的序号值而不是函数名。
CHARSET 对于字符集,并非所有版本的 WINDOWS 都是同样创建的。WINDOWS 9X 系列产品缺少重要的 UNICODE 支持,而 WINDOWS NT 和 WINDOWS CE 系列则一开始就使用 UNICODE。在这些操作系统上运行的 CLR 将UNICODE 用于 STRING 和 CHAR 数据的内部表示。但也不必担心 — 当调用 WINDOWS 9X API 函数时,CLR 会自动进行必要的转换,将其从 UNICODE转换为 ANSI。
如果DLL 函数不以任何方式处理文本,则可以忽略 DLLIMPORTATTRIBUTE 的 CHARSET 属性。然而,当 CHAR 或 STRING 数据是等式的一部分时,应该将 CHARSET 属性设置为 CHARSET.AUTO。这样可以使 CLR 根据宿主 OS 使用适当的字符集。如果没有显式地设置 CHARSET 属性,则其默认值为 CHARSET.ANSI。这个默认值是有缺点的,因为对于在 WINDOWS 2000、WINDOWS XP 和 WINDOWS NT
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯