2011-01-25 7 views
3

Delphi를 처음 사용합니다.Delphi에서 포인터로 DLL 호출

bool __stdcall MyFunction(char * name, int * index) 

C++에서이 DLL 함수를 호출이 코드는 완벽하게 작동합니다 : 난에서 다음 내 보낸 된 함수가있는 DLL을

typedef void (WINAPI * MyFunction_t)(char *, int *); 
void main() 
{ 
    HMODULE mydll = LoadLibrary(L"C:\\mydll.dll"); 
    MyFunction_t MyFunction = (MyFunction_t)GetProcAddress(mydll, "MyFunction"); 

    int index = 0; 

    MyFunction("MyString", &index); 
} 

내가 델파이에서 동일한 작업을 수행해야합니다. 다음은 작동하지 않는 코드입니다 (MyFunction은 호출되지만 인덱스 변수는 적절한 값을받지 못합니다). 이것은 코드 발췌이므로 무질서를 무시하십시오. 모든 입력은 매우 감사하겠습니다!

type 
    TMyFunction= function(name: PChar; var index_ptr: Integer): Boolean; stdcall; 

var 
    fMyFunction : TMyFunction; 
    i : Integer; 
    h: THandle; 

begin 
    Result := 0; 
    h := LoadLibrary('c:\\mydll.dll'); 
    fMyFunction := GetProcAddress(h, 'MyFunction'); 
    if @fMyFunction <> nil then 
    begin 
    fMyFunction('MyString', i); 
    Result := i; 
    end; 
    FreeLibrary(h); 
end; 
+0

당신은 어떤 언어로 빌드 되었습니까? –

+1

C 코드가 'void'함수를 호출하고 있지만 델파이 코드가 bool을 반환하는 함수를 호출합니다 ...? – Roddy

+0

@Roddy 함수를 호출하는 C 코드의 문제이지만이 코드 중 아무 것도 반환 값이없는 것 때문에 –

답변

-5

TMyFunction 유형에 STDCALL을 사용하지 마십시오.

+0

또 하나 : 입력 문자열 'MyString'에 Pchar 변수를 더 잘 할당하는 것이 좋습니다. Pchar 변수를 선언하고 'MyString'문자열을 설정 한 다음 해당 변수를 dll에 전달합니다. 어쩌면 dll 때문에 예외가 발생하고 있습니다. –

+2

C 함수가 __stdcall로 선언되었으므로이 방법으로 PChar를 –

+1

-1로 전달하는 것이 완벽합니다. –

2

우선이 함수가 C++ 변환 단위로 정의 된 경우 extern "C"과 함께 C 링키지를 사용한다고 가정합니다.

Delphi 2009 이상을 사용하는 경우 PChar는 null로 끝나는 문자열 문자열에 대한 포인터임을 알고 있어야합니다.

type 
    TMyFunction= function(name: PAnsiChar; var index: Integer): LongBool; stdcall; 
: 그것은 델파이 Boolean으로 완전히 동일하지 이후

type 
    TMyFunction= function(name: PAnsiChar; var index: Integer): Boolean; stdcall; 

는 C bool 유형이 아마 가장 LongBool에 매핑 :

은 사용하셔야합니다 ANSI C 형 기능을 상호 운용성하려면

\을 문자열로 이스케이프 할 필요가 없으므로 다음과 같이 쓸 수 있습니다.

h := LoadLibrary('c:\mydll.dll'); 

LoadLibrary 호출시 오류를 확인해야하며 기술적으로 hTHandle이 아닌 HMODULE이됩니다. 아무런 문제가 발생하지는 않지만 기술적으로는 h입니다.

개성있는 델파이 작성하는 것입니다 :

if Assigned(fMyFunction) then 
    fMyFunction('MyString', Result); 

하는 것은 기본적으로 나에게 합리적인 보이지만 나는 문자 너비의 가장 의심스러운입니다.

희망이 있습니다.

+0

아주 좋은 대답, 나는 C/C++과 너무 좋지는 않지만, TMyFunction = function (name : PAnsiChar; index : PInteger) : LongBool; stdcall; 내 보낸 함수가 int * index로 정의 되었기 때문에? – ComputerSaysNo

+0

@에 따라 다릅니다. 선택적인 매개 변수 인 경우 제안하는 방법대로 수행해야합니다. 그렇지 않으면 var 매개 변수로 더 좋습니다. –

+0

함수는 bool __stdcall MyFunction (char * name, int * index)로 정의되었으므로 이름과 인덱스가 필수적이라고 생각되지만 어떤 경우에도 C++가 너무 이상하다는 것을 보여줍니다. - \ – ComputerSaysNo