2012-02-10 30 views
12

Tôi đang cố gắng biên dịch một gói chứa DSUtils.pas (một phần của DSPack) và nó không thành công vì nó cố gắng biên dịch đơn vị DirectShow9.pas sai - không phải là một từ DSPack nhưng một từ Delphi XE2 (Update 3) RTL.Không thể biên dịch gói chứa DSUtils trong XE2

vấn đề này có thể được lặp đi lặp lại với một gói tối thiểu:

package Package1; 

{$R *.res} 
{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} 
{$ALIGN 8} 
{$ASSERTIONS ON} 
{$BOOLEVAL OFF} 
{$DEBUGINFO ON} 
{$EXTENDEDSYNTAX ON} 
{$IMPORTEDDATA ON} 
{$IOCHECKS ON} 
{$LOCALSYMBOLS ON} 
{$LONGSTRINGS ON} 
{$OPENSTRINGS ON} 
{$OPTIMIZATION OFF} 
{$OVERFLOWCHECKS OFF} 
{$RANGECHECKS OFF} 
{$REFERENCEINFO ON} 
{$SAFEDIVIDE OFF} 
{$STACKFRAMES ON} 
{$TYPEDADDRESS OFF} 
{$VARSTRINGCHECKS ON} 
{$WRITEABLECONST OFF} 
{$MINENUMSIZE 1} 
{$IMAGEBASE $400000} 
{$DEFINE DEBUG} 
{$ENDIF IMPLICITBUILDING} 
{$IMPLICITBUILD ON} 

requires 
    rtl; 

contains 
    DSUtils in 'x:\common\pkg\dspack\src\DSPack\DSUtils.pas'; 

end. 

Lỗi này xảy ra trong DSUtils dòng 1058 và lỗi là Undeclared identifier: FrameRateCode.

Result.FrameRateCode := (x and $00000003) shr 00; 

Không khai báo là 'FrameRateCode' - CtrlBấm vào kết quả đưa chúng tôi đến Winapi.DirectShow9 (trong thư mục RTL) mà trường này không được khai báo.

Phần thú vị - nếu tôi vào DSUtils sử dụng danh sách, bấm vào DirectShow9 và nhấn Ctrl + Enter, phiên bản DSpack của đơn vị sẽ mở (và đơn vị này đã định nghĩa trường FrameRateCode). Vì vậy, Delphi biết đơn vị ở đâu. Nó chỉ cố gắng biên dịch gói bằng cách sử dụng sai DirectShow9.

Tidbit thú vị: Nếu tôi đang biên dịch một ứng dụng thông thường (không phải gói) sử dụng DSUtils, mọi thứ đều hoạt động tốt.

Những gì tôi đã cố gắng:

  1. Biên soạn DirectShow9 từ DSPack vào gói riêng của mình (trên thực tế tôi sử dụng gói DirectX9 từ DSPack chứa tất cả các file từ thư mục DirectX9) và thêm nó vào 'đòi hỏi ' danh sách. Không hoạt động.

  2. Thêm thư mục có tệp DirectShow9 (từ DSPack) vào đầu đường dẫn hệ thống và khởi động lại. Không hoạt động.

  3. Thêm thư mục có tệp DirectShow9 vào đầu đường dẫn thư viện. Không hoạt động.

  4. Thêm đơn vị DirectShow9 vào gói có đường dẫn rõ ràng. Không hoạt động.

  5. Sao chép DirectX9 * .pas vào thư mục DSPack để đơn vị DirectShow9 nằm trong cùng một thư mục với đơn vị DSUtils. Không hoạt động.

Tôi thấy ba giải pháp có thể xảy ra, nhưng tôi không hài lòng với bất kỳ giải pháp nào trong số đó.

  1. Tôi có thể nhận xét mã có vấn đề. May mắn thay, nó chỉ là một dòng này, mọi thứ khác biên dịch với DirectShow9 của Delphi.

  2. Tôi có thể đổi tên DirectShow9 từ DSPack nhưng sau đó tôi có thể phải sửa phần 'sử dụng' trong ứng dụng khác.

  3. Tôi có thể tắt tự động thêm tiền tố với 'Winapi'. nhưng điều đó sẽ khiến tôi có thêm nhiều công việc chỉnh sửa hàng nghìn và hàng nghìn tệp.

Điều tôi thực sự muốn thấy là nhận XE2 để sử dụng đúng tệp nguồn.

+0

bạn đã thử thêm các đơn vị DirectShow9.pas gói? Tôi nhớ tôi đã gặp vấn đề tương tự trong khi trước đây, nhưng tôi đã cố gắng cài đặt nó trong D2010, tôi đã cố gắng khắc phục nó với những thay đổi tối thiểu, nhưng tôi không thể nhớ mình đã làm như thế nào, gần 2 năm): – ComputerSaysNo

+0

Ồ, vâng, đã thử điều này. Tôi sẽ cập nhật câu hỏi. – gabr

+0

damn ... Tôi lo lắng rằng họ đã phá vỡ một cái gì đó trong XE2 ... bạn đã thử cài đặt nó vào D2010? – ComputerSaysNo

Trả lời

3

Tôi gặp phải vấn đề tương tự, và tôi chỉ đơn giản nhận xét tất cả các dòng sự cố (có 2 hoặc 3 trong số đó). Tất cả mọi thứ hoạt động hoàn hảo tốt.

Một lựa chọn khác là sử dụng DSPack mới nhất (đó là tương thích với XE2): http://code.google.com/p/dspack/

Hoặc bạn có thể đổi tên tập tin DirectShow9 DSPack, như đã thảo luận ở đây: http://www.progdigy.com/forums/viewtopic.php?p=16971

+0

Thú vị, tôi nghĩ rằng tôi đã có DSPack mới. Tôi đã thực sự chắc chắn về điều đó. Tôi đã đi với cách tiếp cận bình luận ở cuối, quá. – gabr

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