2013-02-26 33 views
6

Tôi đã viết một thư viện .dll với rất nhiều chức năng và các lớp trong visual studio 2010. Khi tôi nhìn vào nội dung của tập tin với:tên hàm DLL sử dụng dumpbin.exe

dumpbin.exe /EXPORTS myDll.dll 

tôi nhận được lâu tên hàm với một số loại của một con trỏ hàm vị trí, mà trông như thế này (mục thứ hai trong .dll):

  2 1 0001100A [email protected]@[email protected]@[email protected] = @ILT+5([email protected]@[email protected]@[email protected]) 

Đây là bằng cách nào đó khó đọc, nhưng tôi thấy "đẹp hơn" thủ tục/chức năng danh sách từ khác. dll-s, như sau:

141 8C 00002A08 PogoDbWriteValueProbeInfo 

Làm cách nào để tạo danh sách .dll như vậy?

P.S .: mã nguồn dll của tôi trông như thế này:

namespace codecX 
{ 
    class codec 
    { 
     public: 
     static __declspec(dllexport) double Initialize(double a, double b); 
     ... 
+1

Bạn có chắc chắn muốn xuất các tên chưa được sắp xếp không? Nếu bạn làm điều đó thì bạn sẽ không thể sử dụng chức năng quá tải. Có vẻ như bạn đang xuất một lớp C++. Bạn có xuất phương pháp dụ, nhà xây dựng, v.v. Hoặc tất cả các phương pháp của bạn đều tĩnh? –

+1

http://stackoverflow.com/questions/2804893/c-dll-export-decorated-mangled-names –

+0

David H., có ý định của tôi là xuất định dạng có thể đọc được. Tại sao? Tôi cần phải chuyển qua .dll đã tạo cho các đồng nghiệp khác và định dạng có thể đọc là điều cần thiết để hiểu rõ mã nguồn và/hoặc thư viện được viết bởi người khác. :) – TomiL

Trả lời

7

Bạn cần phải kéo những hàm thành viên tĩnh vào không gian địa chỉ toàn cầu và sau đó quấn chúng với extern "C". Điều này sẽ ngăn chặn C++ tên mangling và thay vào đó cung cấp cho bạn C tên mangling đó là ít xấu xí:

extern "C" __declspec(dllexport) Initialize(double a, double b) 
{ 
    codec::Initialize(a, b); 
} 

và sau đó loại bỏ các __declspec (dllexport) trên hàm thành viên tĩnh của bạn:

class codec 
{ 
    public: 
     static double Initialize(double a, double b); 
} 
+0

John, cảm ơn bạn đã trả lời! Điều này đã giải quyết được vấn đề của tôi! – TomiL

3

này được gọi là tên-mangling và xảy ra khi bạn biên dịch C++ với trình biên dịch C++. Để giữ lại tên "có thể đọc được", bạn sẽ phải sử dụng extern "C" khi khai báo và xác định các lớp và chức năng của bạn. tức là

extern "C" void myFunction(int, int); 

Xem here và cũng google mixing C and C++.

+0

Bạn đã bảo hiểm cây xoài, nhưng bỏ qua đề cập đến trang trí –

+0

@DavidHeffernan Hãy đồng ý tôi đã quên mất nó, được chứ;)? Nhưng bạn đúng, tất nhiên. –

+0

Bash.d, cảm ơn bạn đã trả lời! Đây là những gì tôi cần! – TomiL

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