首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >运行时错误49,对Excel/VBA的D语言DLL调用约定不好--我遗漏了什么?

运行时错误49,对Excel/VBA的D语言DLL调用约定不好--我遗漏了什么?
EN

Stack Overflow用户
提问于 2019-01-17 17:57:16
回答 1查看 301关注 0票数 0

我试图从Excel中的VBA中获得尽可能简单的D语言DLL .我使用Visual .首先,我使用C接口DDLL复制了样板示例,使用以下代码:

代码语言:javascript
运行
复制
module DDLL;

import core.sys.windows.windows;
import core.sys.windows.dll;

__gshared HINSTANCE g_hInst;

extern (Windows)
BOOL DllMain(HINSTANCE hInstance, ULONG ulReason, LPVOID pvReserved)
{
    switch (ulReason)
    {
        case DLL_PROCESS_ATTACH:
            g_hInst = hInstance;
            dll_process_attach( hInstance, true );
            break;

        case DLL_PROCESS_DETACH:
            dll_process_detach( hInstance, true );
            break;

        case DLL_THREAD_ATTACH:
            dll_thread_attach( true, true );
            break;

        case DLL_THREAD_DETACH:
            dll_thread_detach( true, true );
            break;

        default:
    }
    return true;
}

我试图从VBA调用的D应用程序代码如下:

代码语言:javascript
运行
复制
module myfns;
export double testdd(double a, double b) { return a + b + 0; }
export int testi(int x) {return 42 + x ; }
export int testii(int a, int b) { return a + b + 0; }

VBA代码是:

代码语言:javascript
运行
复制
Option Explicit

Declare Function testdd Lib "C:\Users\vvkozlov\sources\DDLL\Win32\Debug\DDLL.dll" _
    Alias "_D5myfns6testddFddZd" (ByVal x As Double, ByVal y As Double) As Double
Declare Function testi Lib "C:\Users\vvkozlov\sources\DDLL\Win32\Debug\DDLL.dll" _
    Alias "_D5myfns5testiFiZi" (ByVal x As Long) As Long
Declare Function testii Lib "C:\Users\vvkozlov\sources\DDLL\Win32\Debug\DDLL.dll" _
    Alias "_D5myfns6testiiFiiZi" (ByVal x As Long, ByVal y As Long) As Long

Public Sub test()

    Dim x As Long: x = 42000

    Debug.Print "two doubles: " & testdd(84#, -42#)
    Debug.Print "one long: " & testi(x)
    Debug.Print "two longs: " & testii(x, -x)

End Sub

注意,我进去了,从生成的DLL中找出了损坏的名称。

testdd (两个双倍)示例按预期工作,但两个int示例的结果都是

代码语言:javascript
运行
复制
Runtime Error 49, Bad DLL calling convention

在VBA。第一、第二和第三次浏览参数声明似乎很好-- VBA端的Long,D中的int

为什么double示例在int失败时工作?

EN

回答 1

Stack Overflow用户

发布于 2019-01-18 08:04:26

亚当·D·鲁普的建议是正确的。D应用程序代码现在看起来像

代码语言:javascript
运行
复制
module myfns;
import std.conv;
extern(Windows) export double testdd(double a, double b) { return a + b + 0; }
extern(Windows) export int testi(int x) {return 42 + x ; }
extern(Windows) export int testii(int a, int b) { return a + b + 0; }

这也有一个好的副作用,至少简化名称损坏(不,从VBA代码中删除别名不起作用)。

VBA现在看起来就像

代码语言:javascript
运行
复制
Option Explicit

Declare Function testdd Lib "C:\Users\vvkozlov\sources\DDLL\Win32\Debug\DDLL.dll" _
    Alias "_testdd@16" (ByVal x As Double, ByVal y As Double) As Double

Declare Function testi Lib "C:\Users\vvkozlov\sources\DDLL\Win32\Debug\DDLL.dll" _
    Alias "_testi@4" (ByVal x As Long) As Long

Declare Function testii Lib "C:\Users\vvkozlov\sources\DDLL\Win32\Debug\DDLL.dll" _
    Alias "_testii@8" (ByVal x As Long, ByVal y As Long) As Long

接下来是BSTR,然后可能是SAFEARRAY。没有Variant

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

https://stackoverflow.com/questions/54241676

复制
相关文章

相似问题

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