2011-01-25 83 views
3

我是Delphi新手。我有一个在它下面的导出函数的DLL:在Delphi中使用指针调用DLL

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

这个代码在C++中调用该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

你用什么语言构建的? – 2011-01-25 20:17:59

+1

你的C代码调用了'void'函数,但是Delphi代码调用了一个函数返回一个bool ...? – Roddy 2011-01-25 20:23:41

+0

@Roddy这是调用函数的C代码中的一个问题,但它看起来是良性的,因为没有任何代码对返回值进行任何操作 – 2011-01-25 21:00:37

回答

-5

请勿在TMyFunction类型中使用STDCALL。

2

首先,我假设您在使用C链接与extern "C"以防在C++翻译单元中定义此函数。

如果您使用的是Delphi 2009或更高版本,则需要了解PChar是指向以空字符结尾的宽字符串的指针。

要与你的ANSI C功能互操作,你需要使用:

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

的C bool类型可能是最好映射到LongBool因为它不是完全一样德尔福Boolean

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

您无需在字符串中跳转\,因此您可以编写:

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

您可能应该检查LoadLibrary调用中的错误,从技术上讲,hHMODULE而不是THandle,虽然这不会导致您任何问题。

惯用德尔福是写:

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

基本上它看起来合理的我,但我最可疑的字符的宽度。

希望有所帮助。