#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 тест);