我用C写的几个函数,其定义如下:
DLLIMPORT  void  setMyPCName(char *c_name)
{
strcpy(pcName, c_name);
}DLLIMPORT void setMyPCFileList(char **p)
{
pPathList=p;
}DLLIMPORT void stopMyPC( )
{
TerminateThread(hControlThread , 0) ;
TerminateThread(hDataThread , 0);
TerminateThread(hBrdcstThread , 0);
}
DLLIMPORT int startMyPC( )
{}这是那个几个函数的定义
那么要怎么样调用呢??
我用delphi调用时,
p:string
p := 'ok'
setMyPCName(@p)
会出现乱码,请问是怎么回事(注:setMyPCName是绝对可靠的,用别的工具测过很多次的)
是不是调用方式的问题比如cdecl stdcall fastcall (注:我的dll是有控制台编译的)
我现在很急,程序明天就要发到美国去的,在线等,希望哪位高人看到了,并且知道帮忙解决一下,
也可以留下QQ之类,有什么问题我再来请教,感激中!!!谢谢了!!!!!!

解决方案 »

  1.   

    var p:pchar
    begin
        p:='ok';
        setMyPCName(p);
        
    end;
    另外,大哥DLLIMPORT 不是导出,是导入,你怎么保证以前对的啊?
      

  2.   

    楼主。。DLLIMPORT????
     DLLEXPORT????把这两个宏的定义看一看吧
    一般C/C++调用参数堆栈约定是, cdecl
    你DELPHI对应函数声明是需要加cdecl修饰词
      

  3.   

    看样子 DLLIMPORT 这个宏不太对 应该是export之类的 才能做为导出函数。
      

  4.   

    宏定义没错,是笔误
    我是这样定义的:
    #define DLLIMPORT __declspec (dllexport)
    还有没有别的错误的可能呢?
      

  5.   

    VC++默认调用方式为cdecl
    所以你应该采用cdecl调用方式
      

  6.   

    那请问我调用setFileList(char **p)
    怎么调用 呢?
    在DELPHI里怎么声明??
    我是这样的
    TsetMyPCFileList = procedure(AFileList: pointer);cdecl;
    setMyPCFileList : TsetMyPCFileList ;
    @setMyPCFileList := GetProcAddress(DLLHandle, 'setMyPCFileList');
    MyPCFileList: PChar;
     MyPCFileList := 'C:\NoFileList'#0#0;(因为是二维指针所以我以#0#0结束循环,dll中的函数是以**p == 0 结束的 )
    setMyPCFileList(@MyPCFileList);这样会有什么问题吗???
    我的程序一运行就会死掉,我觉得是我的循环没有结束所致,各位有什么意见呢?
      

  7.   

    你先看看Dllhandle 是不是等于0
    if dllhandle<> then
        @setMyPCFileList := GetProcAddress(DLLHandle, 'setMyPCFileList');MyPCFileList: PChar;
     MyPCFileList := 'C:\NoFileList';
    setMyPCFileList(@MyPCFileList);在delphi下是没有问题的如果还有问题那你可以试着跟踪一下动态库吧
      

  8.   

    不能这样的;要是这样的话,DLL函数的循环就不会结束,DLL中是以**p == 0 结束循环的
    dllhandle是正常的因为我还有别的函数能正常运行,
    哪位知道是什么原因吗?
    怎样跟踪动态库?