第一次在delphi中调用dll,不会用,想大家帮忙指教一下。别人已经写好vc的dll,结构是这样的:typedef struct dstruc
{
   double x;  
   double y; 
   double td[2]; 
   bool   md[10];
  } DLLstruc ;
extern "C" __declspec(dllexport) DLLstruc* DLLstrucget(DLLstruc* ds);
我现在主要是在delphi中调用该dll来读写数据,但是现在还不知道该怎么调用,请大人们来教教我呢?

解决方案 »

  1.   

    可以先去查一下FAQ之类的 很多人问了的。。type dstruct = record // packed record
      x: double;
      y: double;
      td: array[0..1] of double;
      md: array[0..9] of Boolean;
    end;
    DLLstruc = dstruct;
    PDLLstruc = ^DLLstruc;function DLLstrucget(ds: PDLLstruc):PDLLstruc; stdcall;external 'xxx.dll';name 'DLLstrucget';上面是静态调用
    动态的话 稍微复杂点type Dllstrucget = function(PDllStruct);PDllStruct;stdcall;var
      hInst:HINSTANCE;
      MyFunc: Dllstrucget;
      stuct:  DLLstruc;  hInst := LoadLibrary('***.dll');
      if hInst = 0 then Exit;  MyFunc := GetProcAddress(hInst, 'Dllstrucget');  MyFunc(@stuct);...
      

  2.   


    type dstruct = record // packed record
      x: double;
      y: double;
      td: array[0..1] of double;
      md: array[0..9] of Boolean;
    end;
    DLLstruc = dstruct;
    PDLLstruc = ^DLLstruc;function DLLstrucget( ds:PDLLstruc ): PDLLstruc ; cdecl; external 'XXXXX.dll';
      

  3.   

    我明白了一些基本的dll调用的方法。我接下来在试着使用这个dll的时候出现了这样的一个问题。我现在想把表单上从三个编辑框中获得的值赋值给表单上另外三个编辑框的值,我是这么写的一个代码:edit4.text := floattostr(GetDLLData1(edit1.text));
    但是这样无法调试通过的,是什么原因呢,能不能再提示下?
      

  4.   

    对了, 我是用的静态调用,先在一个unit里面声明了dll,并且在里面implementation后加了
    function GetDLLData1:PPGlobalDLLData;external 'csharedll.dll' name 'GetDLLData1';
      

  5.   

    edit4.text := floattostr(GetDLLData1(edit1.text));
    但是这样无法调试通过的,是什么原因呢,能不能再提示下?// 你看看里面的参数 是一个结构体的指针呀 不是一个string...
    比如
    var 
     myDllStruct:DLLstruc;
     DLLstrucget(@myDllStruct);
     ShowMessage(FloatToStr(myDllStruct.x));
      

  6.   

    哦,是我弄错了,呵呵!另外,我在这个表单上想实现的功能怎么才可以调试出呢?就是先获得edit1,2,3的值给x,y,z,然后把这三个值给edit4,5,6。
    对了,先谢谢你一下,都这么晚了:)
      

  7.   

    我现在是这样的:先给x,y,z赋值,就是myDLLStruct.x := 1, 然后再令edit4.text := myDLLStruct.x;我这样的话等于就是绕过了函数DLLstrucget,应该不对的吧?
      

  8.   

    当然了 你可以直接赋值呀 但是要看你这样做的意义是什么比如 你调用这个函数的目的是什么 你需要这个函数的什么功能? 需要就调用 不需要就算了。。我现在是这样的:先给x,y,z赋值,就是myDLLStruct.x := 1, 然后再令edit4.text := myDLLStruct.x;我这样的话等于就是绕过了函数DLLstrucget,应该不对的吧?
    // 你如果这样做 觉得可以满足你的要求的话 就可以呀var 
     myDllStruct:DLLstruc;
     myDllStruct.x := 1; // 对其成员初始化 DLLstrucget(@myDllStruct);
     ShowMessage(FloatToStr(myDllStruct.x)); // 这个结构体的成员的值可能被DLL改变
     所以 此时 myDllStruct.x 就不一定是1 这样就是调用这个DLL的目的。。
      

  9.   

    我的dll的目的是利用它来把数据传给其他的机器或者从其他的机器获得数据,不知道该怎么来用这个dll?我先把你上面说的方法试试先。还是得你给知道一下啦:)
      

  10.   

    是呀 我上面怎么用DLL不是都说了吗。。还有什么问题?
      

  11.   

    呵呵,我现在知道一点基本的dll的用法了,有点感觉了,但是对于利用这个dll跟别的机器来交换数据就有点没底了,不知从何处下手了?btw:你明天去看海啊:)
      

  12.   

    非常感谢   beyondtkl(大龙驹<明天去看海>)   ,谢谢你!