2010-01-13 4 views
1

에 VC 코드 변환이 필요, 여기에 DLL 헤드 파일의 코드는 암호. 어떻게 그 코드를 델파이로 변환 할 수 있습니까? 고맙습니다!내가 내 델파이 코드에서 DLL 파일을 호출해야합니다 델파이

+0

어떤 델파이 버전입니까? – ThinkJet

+0

sizeof (_BookTime) 및 sizeof (_stBookData) 란 무엇입니까? 레코드가 기계 단어 경계에 맞춰 지거나 정렬됩니까? – ThinkJet

+0

레오, 어느 부분 번역에 문제가 있습니까? 이 특정 * 코드를 번역하도록 요청하면이 질문이 "너무 현지화 된"위험에 빠질 수 있습니다. 일반적인 전세계 잠재 고객은이 특정 코드를 어떻게 번역해야할지 신경 쓰지 않습니다. 어쩌면 당신은 "구조체"가 무엇을 의미하는지, 델파이 타입 인 "unsigned char"가 무엇인지, 매크로가 무엇을하는지, 또는 모든 "const"수정자가 가지는 영향에 대해 궁금 할 것입니다. 이 코드뿐만 아니라 다른 * C++ 코드에도 쉽게 적용될 수있는 질문을하십시오. –

답변

2

발췌문 관리되지 않는 델파이 코드 (테스트하지,하지만 컴파일을위한, 아주 나를 위해 매우 도움이되었다과에 따라 제안 변경 댓글) : 델파이 코드에서

interface 

type 

    TBookTime = packed record 
    day : byte; // unsigned 8-bit 
    month : byte; 
    year : word; // unsigned 16-bit 
    end; 

    TBookData = packed record 
    encrypt : byte; 
    bkTime : TBookTime; 
    PageCount : LongWord; // unsigned 32-bit 
    end; 

    TBookDataPtr = ^TBookData; 

function UpdateBooks(
      pBookID   : PChar; 
      cBookTypeWord : byte; 
      pBookData  : TBookDataPtr; 
      nBookDataCounter : integer 
     ) : integer; stdcall; external 'dll_file_name.dll' name 'UpdateBooks'; 

implementation 

// ... 

end; 

간단한 전화 UpdateBooks(...).


는 업데이트 : 코드 주석에 대한 감사를 변경! 샘플 통화

다음

입니다 조각 ... 모든 조각에 대한

공통 함수와 상수 :

// --- Test procedure in Delphi style ----------------------------------------- 

procedure TestBookUpdate_DelphiStyle; 
var 
    bookArray : array of TBookData; 
    iBookNumber : integer; 
begin 

    SetLength(bookArray, BOOK_DATA_COUNT); 
    try 

    for iBookNumber := Low(bookArray) to High(bookArray) do begin 
     FillTestBookData(@(bookArray[iBookNumber]), iBookNumber); 
    end; 

    UpdateBooks( 
     PChar(BOOK_ID), ord(BOOK_TYPE_WORD), 
     @(bookArray[Low(bookArray)]), BOOK_DATA_COUNT 
    ); 

    finally 
    SetLength(bookArray, 0); // no explicit requirement to include in code 
    end; 

end; 

보너스 : 일반적인 델파이 스타일

// --- Test data fill utility and constants ----------------------------------- 

const 
    BOOK_ID   = 'Test Book ID'; 
    BOOK_TYPE_WORD = 'T'; 
    BOOK_DATA_COUNT = 5; 

procedure FillTestBookData(pBookData : TBookDataPtr; iTestNum : integer); 
begin 
    if(pBookData = nil) then exit; 

    pBookData^.encrypt := iTestNum; 
    pBookData^.bkTime.day := iTestNum; 
    pBookData^.bkTime.month := iTestNum; 
    pBookData^.bkTime.year := 2000 + iTestNum; 
    pBookData^.PageCount := iTestNum; 

end; 

호출 기능 동일한 테스트 C 스타일 및 파스칼 스타일의 전화 :

// --- Test procedure in Old Delphi (plain Pascal) style ---------------------- 

type 
    TBookDataOldArray = array[0..0] of TBookData; 
    TBookDataOldArrayPtr = ^TBookDataOldArray; 

// Store range checking compiler option state 
{$IFOPT R+} 
    {$DEFINE RANGE_CHECK_ON} 
{$ENDIF} 

procedure TestBookUpdate_OldDelphiStyle; 
var 
    bookArrayPtr : TBookDataOldArrayPtr; 
    iBookNumber : integer; 
begin 

    GetMem(bookArrayPtr, BOOK_DATA_COUNT*sizeof(TBookData)); 
    try 
    // Disable range checking compiler option 
    {$R-} 

    for iBookNumber := 0 to BOOK_DATA_COUNT - 1 do begin 
     FillTestBookData(@(bookArrayPtr^[iBookNumber]), iBookNumber); 
    end; 

    // Restore range checking compiler option if turned on before disabling 
    {$IFDEF RANGE_CHECK_ON}{$R+}{$ENDIF} 

    UpdateBooks(
     PChar(BOOK_ID), ord(BOOK_TYPE_WORD), TBookDataPtr(bookArrayPtr), BOOK_DATA_COUNT 
    ); 

    finally 
    FreeMem(bookArrayPtr); 
    end; 

end; 

// --- Test procedure in C style --------------------------------------------- 

procedure TestBookUpdate_CStyle; 
var 
    bookArrayPtr : TBookDataPtr; 
    curBookPtr : TBookDataPtr; 
    curBookNumber : integer; 
begin 

    bookArrayPtr := AllocMem(BOOK_DATA_COUNT * sizeof(TBookData)); 
    try 
    curBookNumber := 0; 
    curBookPtr := bookArrayPtr; 
    while(curBookNumber < BOOK_DATA_COUNT) do begin 
     FillTestBookData(curBookPtr, curBookNumber); 
     inc(curBookNumber); 
     inc(curBookPtr, 1); 
     // Another pointer increment solution is : 
     // curBookPtr := PChar(curBookPtr) + sizeof(TBookData); 
    end; 

    UpdateBooks(PChar(BOOK_ID), ord(BOOK_TYPE_WORD), bookArrayPtr, BOOK_DATA_COUNT); 

    finally 
    FreeMem(bookArrayPtr); 
    end; 

end; 
+0

param "pBookdata"는 둘 이상의 TBookData 구조체를 포함 할 수 있으며, "nBookDataCounter"는 TBookData 구조체의 수를 가리 킵니다. – Leo

+0

레오, ThinkJet의 번역에 반드시 필연적 인 문제는 아니지만 기능 호출이 약간 이상하게 보일 것입니다. 당신은 배열을 가지지 만, 첫 번째 요소를 함수에 전달합니다 :'UpdateBooks (..., BookData [0], Length (BookData))'. ThinkJet, C++의 포인터 매개 변수를 Delphi의 포인터 매개 변수로 변환하는 것이 좋습니다. –

+0

레코드 정렬? 아마 포장해야합니다. 또한 나는 그 모든 것에 대해 penddata를 제외한 모든 CONST를 삭제하는 것이 좋다고 생각합니다. 그 이유는 역 참조 (*)가 삭제 되었기 때문입니다. –

3

사용 h2pas! Freepascal 도구이지만 Delphi 호환 코드를 생성해야합니다.