如上.
以前有写过一些简单的regular的dll 现在需要写给delphi用
问题
1. regular的dll也可以使用mfc类库,需要这么声明 extern "C" VOID WINAPI fun..
但是这样对调用者有另外的要求么>
2. 如果不想使用MFC 直接用API写 很多API也不熟悉 比如说文件操作 多线程等
3. 写好了 delphi中该如何调用? 应该不像vc中同样调用吧就此写过!!

解决方案 »

  1.   

    如果不输出类的话到还可以,要是输出类就不行了啊.
    delphi调用?简单一点就是显式调用了(LoadLibrary)
      

  2.   

    我暂时只封装函数 不过也可能封装struct
    或者说我传参数传一个动态的struct地址之类的.
      

  3.   

    VC中定义
    extern "C" __declspec(dllexport) BOOL Init(char* fileStr1,char* fileStr2,unsigned short portAdree=0X3F8,int fileType2 = 6,int fileTimes = 3)Delphi中引用:
    TMyProc_Init = function(fileStr1:pchar;{上半显示文字,不能大于12个字节}
                              fileStr2:pchar;{走马灯文字}
                              portAdree:word = 1016;{串口地址,默认为串口1(0X3F8),0x2F8为串口2}
                              fileType2:integer = 6;{显示方式}
                              fileTimes:integer = 3{停屏时间}):boolean;cdecl;我上个月刚做的一个项目中的一部分
      

  4.   

    LoadLibrary
    GetProcAddress
    以及引用
    然后再删除库,不用我说了吧?
      

  5.   

    VC中切记用.def文件导出函数名称,否则给delphi调用的函数名有@..等乱七八糟的东西
      

  6.   

    结构定义为stdcall的不是
    函数为cdecl
      

  7.   

    to  wangweintk(枫杨) ( )我可能不能向你那样传入每一个参数 因为我的参数最多可能达30个
    这样 不太理想 所以想传入 结构指针 可后来考虑到 c/c++中 struct与 delphi中
    record可能不一样 所以就没有
    我现在想到了其他的办法代替了
    另: w我现在就是向你说的那样做的 
    对了 谁知道c/c++/vc中 自动解析/读取 ini文件的函数??
    据说 delphi中有.还能用缺省参数么??3x all。
      

  8.   

    其实我这个函数也要很多参数,我试过用结构指针传,只要两边的类型匹配,是可以了。不过,调用方也要定义一个结构,比较麻烦。缺省参数(象我上面用的),不会有问题,因为我做的这个项目已经验收并交付了。关于你的"自动解析/读取 ini文件的函数??"我不太明白。
      

  9.   

    哦 我问的 读取ini文件的函数是 api函数 已经查到了.对了
    我刚做了dll的部分 实现了部分函数
    我是用的mfc的静态使用Mfc类的 regualar类 可是我测试的使用(vc调用) 却有问题?
    我的做法如下
    1. def 导出函数名
    2. 调用者工程包含.lib 与.h文件
    可是当我在 使用dll中导出的函数时 提示说: error LNK2001: unresolved external symbol _SetFileDir请教:
    那是我的调用方式有误?我以前写过win32的dll就是这样调用的 无误.
    或者还是我的创建方式有误,因为我只想导出函数 不想导出类 所以用正规的静态使用mfc类的dll。kkk
    非常感谢.
      

  10.   

    to  wangweintk(枫杨) ( )我如果用win32 dll的话 是不是就万事Ok??
      

  11.   

    ? 我现在用纯粹的 win32 dll好了。
      

  12.   

    当然应该用纯32的dll,否则delphi应该不能调用。搞定了,祝贺你...
      

  13.   

    TO  wangweintk(枫杨) :搞定是搞定了 可这样效率实在太低 因为我这样的设计方式不行 直接用api操作的话 而调用方调用频繁 这样就导致频繁的文件读写操作,就可能导致频繁的换页等 久了使得效率急剧下降所以我现在又采用基于mfc的 static regular dll,我采取CStdioFile的读写方式,一次性读取所有数据到内存块 然后再解析内存块 这样应该效率更高可是 我基于mfc的 static regular dll 不熟悉,还望告知!!
    谢谢.
      

  14.   

    即在c中定义struct 在delphi中定义record 数据结构完全一样 包括数据类型 数据长度 与数据顺序 在c中dll的函数开始是直接用 struct* 类型作为参数调用 不行你的函数的调用约定是否定义成了__stdcall类型,默认的C函数的调用约定都是__cdecl的,
    Delphi中是没有实际的指针的,你向他传递指针好象有点不妥,不妨传递一个结构体变量试一试,由于对Delphi不是很熟,只能提个建议!^_^
      

  15.   

    斑竹 我在delphi中的调用是__cdecl 是可以正确调用的
    可是就是在传结构指针的话就有问题
    我在c中声明:
    1. extern "C" WINAPI TestStruct1(char* pFileName, StructA* pStruct)
    2. extern "C" WINAPI TestStruct2(char* pFileName, void* pStruct)
    {
       StructA* p = (StructA*)pStruct;
    }delphi中调用
    t
      

  16.   

    type
    newType=record
      age: Array[0..10] of pChar;
      name: Array[0..10] of pchar;
      sex: Array[0..6] of pchar;然后调用
    var
      test:newType;
    然后分别给test的数据赋值 然后 TestStruct1(fileName, test);
    注意: 只有成功写入 test.age的数据 而后面的都没有传入 这是为什么呢
    为什么只能传入结构的第一个数据?