Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Delphi中用指针调用dll_Delphi_Dll_Pointers - Fatal编程技术网

在Delphi中用指针调用dll

在Delphi中用指针调用dll,delphi,dll,pointers,Delphi,Dll,Pointers,我是德尔福的新手。我有一个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 MyFunct

我是德尔福的新手。我有一个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;
类型
TMyFunction=函数(名称:PChar;变量索引:整数):布尔;stdcall;
变量
fMyFunction:TMyFunction;
i:整数;
h:THandle;
开始
结果:=0;
h:=LoadLibrary('c:\\mydll.dll');
fMyFunction:=GetProcAddress(h,'MyFunction');
如果@fMyFunction为零,则
开始
fMyFunction('MyString',i);
结果:=i;
结束;
免费图书馆(h);
结束;

<代码> > p>不要在您的TMyType类型中使用STDCULL。

< P>首先,假设在C++翻译单元中定义了该函数,则假定您使用C链接与<代码>外“C”<代码>。

如果您使用的是Delphi 2009或更高版本,则需要注意PChar是指向以null结尾的wide字符串的指针

要与ANSI C函数进行互操作,您需要使用:

type
  TMyFunction= function(name: PAnsiChar; var index: Integer): Boolean; stdcall;
C
bool
类型可能最好映射到
LongBool
,因为它与Delphi
Boolean
不完全相同:

type
  TMyFunction= function(name: PAnsiChar; var index: Integer): LongBool; stdcall;
无需以字符串形式转义
\
,即可编写:

h := LoadLibrary('c:\mydll.dll');
您可能应该检查LoadLibrary调用中的错误,从技术上讲,
h
是一个
HMODULE
而不是
THandle
,尽管这不会给您带来任何问题

惯用的德尔菲是这样写的:

  if Assigned(fMyFunction) then
    fMyFunction('MyString', Result);
基本上,我觉得它很合理,但我最怀疑的是字符宽度


希望对您有所帮助。

您的dll是用什么语言构建的?您的C代码正在调用“void”函数,但是Delphi代码调用了一个返回bool的函数…?@Roddy这是调用该函数的C代码中的一个问题,但它似乎是良性的,因为这些代码都没有对返回值做任何处理。另一件事:您最好为输入字符串“MyString”分配一个Pchar变量。声明一个Pchar变量,在其上设置“MyString”字符串,并将该变量传递给dll。也许dll因此引发了一个异常。用这种方式传递PChar是完全正确的非常好的回答,我对C/C++不太在行,但是TMyFunction不应该被定义为TMyFunction=function(名称:PAnsiChar;索引:PInteger):LongBool;stdcall;由于导出的函数定义为int*index?@dorin,这取决于。如果它是一个可选参数,那么应该按照您建议的方式执行。否则,它会作为var参数更好。这个函数被定义为布尔-ysSTDLead MyFalm(char * Node,int * index),所以我怀疑名称和索引是强制性的,但是无论如何,这会告诉你C++过于神秘:-\doLin没有,你不能从代码签名中看出。两者都有可能。看看msdn中的几个api文档,看看一些指针参数将如何标记为[in,opt],比如,以及其他只是[in]。您应该始终编写它,它适用于旧版本的delphi,并且在升级时/升级时不需要更改。OP还没有说他使用的是什么版本的delphi。