2014-07-04 12 views
5

Próbuję wywołać bibliotekę DLL C++ z Excel-VBA.Excel VBA: "Błąd wykonania" 49 ': Zła konwencja wywoływania bibliotek DLL "wywoływanie C++ dll

Wiem, że funkcja DLL jest wykonywana, ponieważ wstawiłem fputs() rejestrujące wywołania w celu śledzenia wykonania, a znaczki są wyświetlane w moim pliku dziennika. Problemem jest to, gdy funkcja zwraca DLL, ja się błąd 49.

Oto deklaracja w VBA:

Private Declare Function InitMCR Lib "MCRBoilerplate.dll" Alias "[email protected]@YGXXZ"() 

i tu jest deklaracja w C++

__declspec(dllexport) void __stdcall initMCR() { ... } 

Dlaczego jestem uzyskanie tego zachowania błędu 49, mimo że połączenia DLL wydają się działać?

+0

OK, wydaje mi się, że źle zinterpretowałem twoją pierwszą wersję zbyt wcześnie, nie będąc poprawnym pytaniem. Teraz widzę, że chciałeś podać kolejne pytania i odpowiedzi, podając rozwiązanie. Polecam umieścić część rozwiązania jako odpowiedź na pytanie. Możesz to zrobić tutaj, jest ważny i zachęcany. –

+2

Rozważ umieszczenie swojego rozwiązania jako odpowiedzi – Niall

+0

@wgrant/OT Uwaga: Nie musisz klikać opcji "zapisz", aby utworzyć kopię zapasową pośrednich wersji swoich edycji (tworzy kopię zapasową wersji roboczych podczas edycji po określonym czasie)). Gdy tylko klikniesz "zapisz", publikujesz swoje rzeczy, a możesz otrzymać downvotes i krytykę na temat faktycznie niedokończonych rzeczy. Przepraszamy za początkowe głosowanie w dół/zamknięcie, ale ogólnie jestes mile widziany. Umieść swoje rozwiązanie jako odpowiedź zgodnie z sugestią, a ja nawet zgodzę się z obydwoma. –

Odpowiedz

0

Szybka punkt: Twój problem może nie być niezgodnością parametrów w funkcji zewnętrznej lub w deklaracji, która ją importuje - w VBA występuje znany błąd kompilatora, który powoduje błąd 49.

'Stacker pstraton's answer to 'Excel - Runtime Error 49: Bad DLL calling convention'

Nie jesteś całkowicie bez winy - prawdopodobnie masz niedopasowanie parametrów ze zwracanego typu, który powinny praca (Long wypełniania int warianty wypełnianie czegokolwiek) w funkcji wywołującej - ale nigdy nie słyszałem, aby ktokolwiek wyganiał trwały błąd Runtime Error 49 poprzez lepsze kodowanie. Po prostu przekompilujesz lub wyeksportujesz i ponownie zaimportujesz moduły.

Najgorsze, że oryginalne Forty-Niner jest o wiele trudniejsze do debugowania, niż powinno być: instrukcja, która uruchamia komunikat o błędzie, zwykle nie jest wezwaniem do źle zinterpretowanej funkcji zewnętrznej. Jeśli masz szczęście, jest to "Exit Sub" dzwoniącego; i przez pewien czas jest to coś, co jest dalej na stosie, które można prześledzić do złego połączenia; ale czasami nie jest to wcale oczywiste i nie ma żadnej deterministycznej strategii debugowania.

Powiązane problemy