Доступ к DLL из 32-разрядной версии Excel 2016 получить «Anwendungfehler49»

#c #excel #vba

#c #excel #vba

Вопрос:

Я получаю «Anwendungsfehler 49», вызывающий 32-разрядную версию dll из 32-разрядного Excel 2016. Бит Excel64 с 64-разрядной версией dll работает нормально. Окно сообщения в dll показано, но после этого в возврате возникает ошибка. У кого-нибудь есть идея для этого?

Вот мой dll-код:

 // dllmain.cpp : Definiert den Einstiegspunkt für die DLL-Anwendung.
#include "pch.h"
#include <iostream>

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

TEST_API long myTestFunction(LPCSTR test)
{
    size_t origsize = strlen(test)   1;
    const size_t newsize = 100;
    size_t convertedChars = 0;
    wchar_t wcstring[newsize];
    mbstowcs_s(amp;convertedChars, wcstring, origsize, test, _TRUNCATE);
    wcscat_s(wcstring, L" (wchar_t *)");
    
    MessageBox(NULL, L"Open the message box ", wcstring, MB_OK | MB_SYSTEMMODAL);
    return (long) 42;
}

// pch.h: 
#ifndef PCH_H
#define PCH_H

// Fügen Sie hier Header hinzu, die vorkompiliert werden sollen.
#include "framework.h"

#endif //PCH_H

#if defined(_MSC_VER)
#include <windows.h>
#define TEST_API extern "C" __declspec(dllexport)
#else
#define TEST_API 
#endif

TEST_API long myTestFunction(LPCSTR test);
 

Код Excel vba:

 #If Win64 Then
    Private Declare PtrSafe Function myTestFunction Lib "MyTestDll.dll" (ByVal parameter As String) As Long
#Else
    Private Declare Function myTestFunction Lib "MyTestDll32.dll" (ByVal parameter As String) As Long
#End If
    
Sub Test()
Dim Result As Long
    
Result = myTestFunction("This is a test!")
    
End Sub
 

Комментарии:

1. Должно быть __stdcall , чтобы избежать повреждения указателя стека в 32-разрядном режиме.

2. да, здорово. Вместе с новым созданным файлом def (для экспортируемой функции) он работает. #если определено(_MSC_VER) #включить <windows.h> #определить TEST_API(ReturnType) extern «C» __declspec(dllexport) ReturnType __stdcall #else #определить TEST_API #endif TEST_API(длинный) myTestFunction(LPCSTR тест);