首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >运行时错误49,不良的DLL调用约定

运行时错误49,不良的DLL调用约定
EN

Stack Overflow用户
提问于 2013-04-02 07:49:54
回答 8查看 13.7K关注 0票数 13

问:每当加载我的外接程序时,Excel总是抛出以下错误(运行时错误49,不良的DLL调用约定)

尽管绝对没有外部DLL引用,但每次都会弹出对话框,但没有指示错误在哪里。

每次保存特定代码行时,Excel都会崩溃。

怎么解决这个问题呢?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2013-04-02 07:49:54

此错误可能是由于编译器错误而发生的。对此,最简单的解决方案是进行一个小的代码更改并重新编译。我通常做的是,

1 ->将Private Enum类型添加到加载项中任何模块的顶部。

代码语言:javascript
运行
复制
Private Enum Something
    member = 1
End Enum

2 -> 编译加载项

3 ->重启excel

4 ->删除所做的代码更改。这已经没有必要了。

票数 20
EN

Stack Overflow用户

发布于 2014-09-20 00:15:29

  1. 即使此错误引用外部(DLL)函数调用,它也可以由参数或VBA定义的函数或子例程的返回值类型不匹配触发。此外,当由这些原因触发时,调试器有时会将错误点显示为不同的函数调用,通常在调用堆栈中更高,包括在创建问题情况之前一直工作和稳定的调用。通常,问题是由固定类型的参数-参数或返回值与变体或反之亦然的不匹配触发的。 示例:变量值函数在运行时返回一个分配给Integer变量的长值。 分辨率

代码语言:javascript
运行
复制
- Carefully check all parameter-argument and return value types and assignment statements, especially for routines that you have been recently working on. If any are Variant-valued functions, explicitly type-cast to the correct type for the assignment.
- If the above situation is unavoidable due to using the Application.Run method to call a routine in a different workbook (for which you have no control over the parameter definitions), as a result of the Application.Run method passing all arguments ByVal, then, if the containing routine is a Sub, try converting it to a Function with no specified return type.  This seems to force a clean-up of the stack and suppresses the error condition being thrown at a higher level in the call-stack.

  1. 一个对象方法(如AutoFit)应用于错误的对象变体,而该方法是不可用的(例如AutoFit应用于既不是整个行也不是整个列范围的范围)。类似于上面的场景,错误可能被抛出在存在问题语句的例程的返回点,而不是在语句本身。 Resolution:从修复语法问题开始。不幸的是,应该工作的修复有时会继续抛出错误,直到VBE编辑器被重置。我还没有推导出解决这一问题的最小步骤集,但类似这样的步骤通常是有效的:

代码语言:javascript
运行
复制
- Explicit recompile the project.
- Save the file and close it.
- Re-open the file and re-run the code.

  1. 如果对外部库函数的调用被确定为罪魁祸首,请参阅Microsoft关于错误的文档: 坏DLL调用约定 *传递给动态链接库(DLL)的参数必须与例程所期望的完全匹配。调用约定处理参数的数量、类型和顺序。您的程序可能正在调用DLL中的一个例程,该例程传递的参数类型或数量都是错误的。 若要更正此错误,请确保所有参数类型都符合您正在调用的例程声明中指定的参数类型。 请确保传递的参数数量与调用的例程声明中指示的参数相同。 如果DLL例程按值要求参数,请确保在例程的声明中为这些参数指定了ByVal。 返回参数:在谈论过程参数时,有一件事很容易被忽略,那就是返回参数。确保它的类型是正确的,或者它没有丢失。Excel/VBA用户习惯于这样一个事实:如果您省略了函数的返回类型,系统将返回类型隐式设置为Variant,并且它可以处理任何返回的数据。外部声明的函数不是这样的!!必须在DECLARE语句中声明返回类型。
  2. 中断的库引用:检查模块代码的库引用是否有效。在VBA中,选择Tools=>References以查看引用库的列表,并确保所有选中的项都没有标记为“缺失”。如果是的话,那就解决这些问题。
票数 9
EN

Stack Overflow用户

发布于 2016-04-19 13:42:07

或者,最好的选择:

-重写例程的名称.

-然后重新编译!

你现在可以走了!

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15758834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档