2010-02-16 47 views
5

Chúng tôi cố gắng vượt qua một chuỗi từ một chương trình Delphi bản địa để một Delphi Prism DLL. Chúng tôi không gặp vấn đề gì khi truyền số nguyên, nhưng các chuỗi không khớp trong DLL. Chúng tôi đã thấy Robert Love's code snippet để trả lời cho một câu hỏi khác, nhưng không có mã cho chương trình Delphi gốc.Làm thế nào tôi có thể vượt qua một chuỗi Delphi để một Prism DLL?

Làm cách nào để chúng tôi có thể chuyển chuỗi từ Delphi sang Delphi Prism DLL?

+3

Đây là một cộng đồng, do đó bạn không nên áp đặt một người trong câu hỏi của mình. Nếu bạn muốn làm điều đó viết bình luận cho câu trả lời của mình. Nếu bạn viết một câu hỏi (tốt hơn trong trường hợp này), hãy cố gắng xây dựng câu hỏi đó càng chung càng tốt. – jpfollenius

+0

Đồng ý. Robert Giesecke đã trả lời điều này tốt hơn tôi có thể có. –

Trả lời

1

Chuỗi trong Delphi Win32 được quản lý khác với chuỗi trong .Net, vì vậy bạn không thể chuyển chuỗi .Net tới Delphi Win32 hoặc ngược lại.

Để trao đổi giá trị chuỗi, bạn nên sử dụng loại PChar được hỗ trợ bởi cả hai trình biên dịch. Đó cũng giống như cách bạn gửi các giá trị chuỗi tới các hàm Windows API.

Kính trọng

P.S. Tôi KHÔNG phải là Robert ;-)

+0

Xin lỗi, đây phải là một thông báo cho tác giả của đoạn mã được đề cập ở trên. Nhấp vào nút sai. Nhưng dù sao, nó hoạt động như thế nào để sử dụng PChar. Lăng kính Delphi không có loại PChar. nếu tôi sử dụng pchar trong delphi bản địa và chuỗi trong lăng kính, tôi nhận được quyền char đầu tiên. Nhưng chỉ có một char. Cách sửa lỗi này? –

+1

Đừng lo, Marcus. Bạn chưa có đủ điểm danh tiếng, vì vậy bạn sẽ không thể đăng một lời khen cho câu hỏi của người khác. Đó là một câu hỏi hợp pháp. Tôi đã chỉnh sửa nó cho bạn vì vậy nó không giống như bạn đang cố gắng gửi một tin nhắn trực tiếp, mà Stack Overflow không hỗ trợ. –

+0

PChar chỉ đơn giản là một con trỏ tới một ký tự, để gửi một chuỗi như vậy bạn cần trỏ đến ký tự đầu tiên và thứ hai, xác định độ dài của dữ liệu chuỗi, để đầu kia có thể đọc dữ liệu từ điểm bắt đầu đến chiều dài của chuỗi. Nếu hàm DLL của bạn trả về bất kỳ giá trị chuỗi nào, thì đầu kia sẽ cung cấp một không gian bộ nhớ và gửi địa chỉ bắt đầu và độ dài của nó đến hàm của bạn để chức năng của bạn có thể ghi dữ liệu đầu ra vào không gian bộ nhớ đó. – vcldeveloper

8

Cách tốt nhất là sử dụng WideString.

Vì nhiều lý do.

  • Đó là Unicode và các công trình trước khi D2009
  • Đó là bộ nhớ được quản lý trong ole32.dll, vì vậy không phụ thuộc vào một trong hai nhà quản lý bộ nhớ của Delphi hoặc CLR GC.
  • Bạn không cần phải đối phó trực tiếp với con trỏ

Trong Oxygene, bạn có thể viết nó như vậy:

type 
    Sample = static class 
    private 
    [UnmanagedExport] 
    method StringTest([MarshalAs(UnmanagedType.BStr)]input : String; 
         [MarshalAs(UnmanagedType.BStr)]out output : String); 
    end; 

implementation 

method Sample.StringTest(input : String; out output : String); 
begin 
    output := input + "ä ~ î 暗"; 
end; 

"MarshalAs" kể CLR làm thế nào để sắp xếp chuỗi lui. Nếu không có nó, các chuỗi được chuyển thành Ansi (PAnsiChar), có lẽ là NOT những gì bạn muốn làm.

Đây là làm thế nào để sử dụng nó từ Delphi:

procedure StringTest(const input : WideString; out output : WideString); 
    stdcall; external 'OxygeneLib'; 

var 
    input, output : WideString; 
begin 
    input := 'A b c'; 
    StringTest(input, output); 
    Writeln(output); 
end. 

Ngoài ra, bao giờ loại sử dụng, không được xác định rõ ràng, đối với các giao diện bên ngoài. Bạn không được sử dụng PChar để nhập hoặc xuất DLL. Vì nếu bạn làm như vậy, bạn sẽ gặp phải các ngoại lệ khi bạn biên dịch nó với D7 hoặc D2009 (tùy thuộc vào hệ thống dev gốc)

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