我在主程序中定义一个变量gXm,但是在DLL中访问此变量是乱码,请问是什么问题?主程序:
...
var 
 gXm:Pchar;
...
procedure TForm1.Button3Click(Sender: TObject);
begin
 gXm := Pchar('YCC');
end;
exports
  gxm;  
DLL:var
 MainModuleHandle:THandle;
 Pstr:PChar ;
begin
   MainModuleHandle:=GetModuleHandle(pchar(ExtractFileName(application.ExeName)));
   Pstr:= PChar(GetProcAddress(MainModuleHandle,pchar('gXm')));
   if Pstr <> nil then
     Edit1.Text := Pstr
   else
     Edit1.Text := 'aaa';  
end;

解决方案 »

  1.   

    等等,我晕你到底是在干什么?怎么会在dll中GetProcAddress?你所谓的主程序是什么?怎么会在这里exports?
      

  2.   

    在DLL中访问主程序的变量?
    这样有意义吗?
      

  3.   

    为什么要在DLL中调用主程序中的变量呢??这样的话要DLL做什么??
      

  4.   

    当然有用处了在主程序中定义一个变量,然后在DLL中根据此变量查询其他东东
      

  5.   

    你得到的是指针本身的地址而不是它指向的内容
    Pstr:= PChar(GetProcAddress(MainModuleHandle,pchar('gXm')))^;
    后面加一个^试试
    我不敢保证对
      

  6.   

    在DLL中根据此变量查询其他东东
    ————————————————————————用参数多好?为什么要搞这么复杂呢?而且能这样用吗?我没见过
      

  7.   

    我晕倒了,麻烦你们把我抬回家
    为什么要在dll中调用调用它的程序中的变量呢,它没有任何主动权的呀,如果要传递一个变量进Dll,为什么不在导出函数中以var方式传入再传出,或者直接用函数返回呢?好奇怪的想法,我想都没想过,是不是想给DLL加密?
      

  8.   

    Dll是不能够主动访问Host程序中的任何东西的,一般都是Host程序主动从Dll中读取数据。
    实现你想要的效果的方法可以是用Dll给Host发消息,然后通过消息参数传回变量值。或者把变量以参数的形式放在调用Dll的函数的参数列表中。
      

  9.   

    Dll是不能够主动访问Host程序中的任何东西的,错!!!!!用内存映射就可以了
      

  10.   

    我现在不考虑你的dll要实现的功能,在动态连接库中,不要对字符串类型强制类型转化,最好是用两个函数strpcopy,strpas进行互相转化,就不会出现问题了,你可以试试看,应该没有什么问题
      

  11.   

    GetProcAddress返回值是地址指针,不是指向字符串的指针。
      

  12.   

    同理﹐正如在应用程序调用Dll一样﹐在Dll中应该这样调用﹕
    var
     MainModuleHandle:THandle;
     Pstr:PChar ;
    begin
      try
        MainModuleHandle:= LoadLibrary(PChar(Application.ExeName));
        Pstr:= PChar(GetProcAddress(MainModuleHandle,pchar('gXm')));
        if Pstr <> nil then
          Edit1.Text := Pstr
        else
          Edit1.Text := 'aaa';  
      finally
        FreeLibrary(MainModuleHandle);
      end;
    end;
      

  13.   

    主程序把变量做为参数传给DLL
    DLL取了处理不就行了?
    郁闷中..........
      

  14.   

    用内存映射CreateFileMapping,OpenfileMapping