2014-07-04 36 views
5

Tôi đang cố gắng gọi một DLL C++ từ Excel-VBA.Excel VBA: "Lỗi thời gian chạy '49': Quy ước gọi sai DLL" gọi C++ dll

Tôi biết chức năng DLL đang được thực hiện khi tôi chèn các lệnh gọi hàm fputs() để theo dõi việc thực hiện và các dấu hiện đang hiển thị trong tệp nhật ký của tôi. Vấn đề là, bất cứ khi nào trở về chức năng DLL, tôi nhận được Lỗi 49.

Đây là tuyên bố trong VBA:

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

và đây là việc khai báo trong C++

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

Tại sao tôi nhận hành vi Lỗi 49 này, mặc dù các cuộc gọi DLL dường như đang hoạt động?

+0

OK, có vẻ như tôi đã hiểu sai phiên bản đầu tiên của bạn quá sớm không phải là câu hỏi hợp lệ. Bây giờ tôi thấy, bạn muốn cung cấp một Giải Đáp khác bằng cách đưa ra giải pháp. Tôi khuyên bạn nên đặt phần giải pháp của bạn như một câu trả lời cho câu hỏi. Bạn có thể làm như vậy ở đây, nó hợp lệ và được khuyến khích. –

+2

Xem xét việc đăng giải pháp của bạn dưới dạng câu trả lời – Niall

+0

@wgrant/OT Lưu ý: Bạn không cần phải nhấp vào 'lưu' để tải phiên bản trung gian của các chỉnh sửa của bạn được sao lưu tại đây (SO sao lưu thư nháp của bạn trong khi bạn đang chỉnh sửa sau một thời gian nhất định). Ngay sau khi bạn nhấp vào 'lưu', bạn đang xuất bản nội dung của mình và bạn có thể nhận được những đánh giá và phê bình về nội dung thực sự chưa hoàn thành của mình. Xin lỗi cho các phiếu bầu xuống/đóng ban đầu, bạn được chào đón nói chung. Đặt giải pháp của bạn như là một câu trả lời như gợi ý, và tôi thậm chí sẽ upvote cả hai của nó. –

Trả lời

2

Trong VBA, chức năng mà trở void cần phải được khai báo là Sub thay vì Function

Vì vậy, việc kê khai trong VBA nên là:

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

Xem MSDN page on VBA Declare statement

0

Một điểm nhanh chóng: bạn vấn đề có thể không phải là một tham số không khớp trong hàm bên ngoài của bạn, hoặc trong khai báo nhập khẩu nó - có trục trặc trình biên dịch đã biết trong VBA làm tăng lỗi 49.

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

Bạn không phải là hoàn toàn vô tội - bạn có thể có sự không phù hợp tham số với một loại trở lại mà nên công việc (Long Populating một Int, biến thể Populating chỉ là về bất cứ điều gì) trong hàm gọi - nhưng tôi chưa bao giờ nghe nói về bất cứ ai trục xuất một Runtime Error 49 dai dẳng bằng cách mã hóa tốt hơn. Bạn chỉ cần biên dịch lại, hoặc xuất và nhập lại các mô-đun.

Điều tồi tệ nhất của nó là một chính hãng Bốn mươi Niner còn lâu mới khó khăn hơn để gỡ rối hơn nó cần phải được: báo cáo kết quả làm kích hoạt các thông báo lỗi thường không phải là một cuộc gọi đến các chức năng bên ngoài misdeclared. Nếu bạn may mắn, đó là 'Exit Sub' của người gọi; và một số thời gian nó là cái gì đó tiếp tục lên ngăn xếp mà bạn có thể theo dõi trở lại cuộc gọi xấu; nhưng, đôi khi, nó không rõ ràng chút nào và không có chiến lược gỡ lỗi xác định nào cả.

Các vấn đề liên quan