主题:帮我看看
文件如下:
问题:
为什么data(int类型)可以共享,而a(char*类型)却会出问题呢?谢谢
1)a:dll的文件SharedDLL.cpp:
/---------------------------------------------------------------------------
#pragma option -zRSHSEG
#pragma option -zTSHCLASS
#include <vcl.h>
#include <windows.h>
#include "SharedDll.h"
#pragma hdrstop
#pragma argsused
int data = 99;
char* a="我是OK!.....................";
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
return 1;
}
//---------------------------------------------------------------------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
return 1;
}
extern int data;
void DLL_EXPORT SetData(char* x)
{
a =x;
}
char* DLL_EXPORT GetData()
{
return a;
}
int DLL_EXPORT GetDatad()
{
return data;
}
void DLL_EXPORT SetDatad(int x)
{
data =x;
}
//----------------------------------------------------
b:dll的文件SharedDll.h
#ifdef __DLL__
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif
extern "C"
{
void DLL_EXPORT SetData(char* x);
char* DLL_EXPORT GetData();
void DLL_EXPORT SetDatad(int x);
int DLL_EXPORT GetDatad();
}
//--------------------------------------------------------------
c:dll的文件Shared.def:
LIBRARY SHAREDDLL
SEGMENTS
SHSEG CLASS 'SHCLASS' SHARED
//--------------------------------------------------------------------
2)执行文件ddd.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "ddd.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
HMODULE hModule;
char* x;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
hModule=LoadLibrary("de.dll");
if(hModule==NULL)
MessageBox(NULL,"导入DLL失败!","提示",MB_OK);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
r=(B)GetProcAddress(hModule,"_GetData");
//x=&e();
Edit1->Text=r();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
e=(A)GetProcAddress(hModule,"_SetData");
e(Edit2->Text.c_str());
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
FreeLibrary(hModule);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
k=(D)GetProcAddress(hModule,"_GetDatad");
//x=&e();
Edit1->Text=IntToStr(k());
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
o=(C)GetProcAddress(hModule,"_SetDatad");
o(StrToInt(Edit2->Text));
}
//---------------------------------------------------------------------------
//ddd.文件
//---------------------------------------------------------------------------
#ifndef dddH
#define dddH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <windows.h>
extern "C" __declspec(dllimport) void SetData(char* x);
extern "C" __declspec(dllimport) char* GetData();
extern "C" __declspec(dllimport) void SetDatad(int x);
extern "C" __declspec(dllimport) int GetDatad();
typedef void (*A)(char*);
typedef char*(*B)();
typedef void (*C)(int);
typedef int(*D)();
A e;
B r;
C o;
D k;
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TEdit *Edit1;
TEdit *Edit2;
TButton *Button1;
TButton *Button2;
TButton *Button3;
TButton *Button4;
TButton *Button5;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
void __fastcall Button3Click(TObject *Sender);
void __fastcall Button4Click(TObject *Sender);
void __fastcall Button5Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
问题:
为什么data(int类型)可以共享,而a(char*类型)却会出问题呢?谢谢
1)a:dll的文件SharedDLL.cpp:
/---------------------------------------------------------------------------
#pragma option -zRSHSEG
#pragma option -zTSHCLASS
#include <vcl.h>
#include <windows.h>
#include "SharedDll.h"
#pragma hdrstop
#pragma argsused
int data = 99;
char* a="我是OK!.....................";
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
return 1;
}
//---------------------------------------------------------------------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
return 1;
}
extern int data;
void DLL_EXPORT SetData(char* x)
{
a =x;
}
char* DLL_EXPORT GetData()
{
return a;
}
int DLL_EXPORT GetDatad()
{
return data;
}
void DLL_EXPORT SetDatad(int x)
{
data =x;
}
//----------------------------------------------------
b:dll的文件SharedDll.h
#ifdef __DLL__
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif
extern "C"
{
void DLL_EXPORT SetData(char* x);
char* DLL_EXPORT GetData();
void DLL_EXPORT SetDatad(int x);
int DLL_EXPORT GetDatad();
}
//--------------------------------------------------------------
c:dll的文件Shared.def:
LIBRARY SHAREDDLL
SEGMENTS
SHSEG CLASS 'SHCLASS' SHARED
//--------------------------------------------------------------------
2)执行文件ddd.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "ddd.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
HMODULE hModule;
char* x;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
hModule=LoadLibrary("de.dll");
if(hModule==NULL)
MessageBox(NULL,"导入DLL失败!","提示",MB_OK);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
r=(B)GetProcAddress(hModule,"_GetData");
//x=&e();
Edit1->Text=r();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
e=(A)GetProcAddress(hModule,"_SetData");
e(Edit2->Text.c_str());
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
FreeLibrary(hModule);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
k=(D)GetProcAddress(hModule,"_GetDatad");
//x=&e();
Edit1->Text=IntToStr(k());
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
o=(C)GetProcAddress(hModule,"_SetDatad");
o(StrToInt(Edit2->Text));
}
//---------------------------------------------------------------------------
//ddd.文件
//---------------------------------------------------------------------------
#ifndef dddH
#define dddH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <windows.h>
extern "C" __declspec(dllimport) void SetData(char* x);
extern "C" __declspec(dllimport) char* GetData();
extern "C" __declspec(dllimport) void SetDatad(int x);
extern "C" __declspec(dllimport) int GetDatad();
typedef void (*A)(char*);
typedef char*(*B)();
typedef void (*C)(int);
typedef int(*D)();
A e;
B r;
C o;
D k;
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TEdit *Edit1;
TEdit *Edit2;
TButton *Button1;
TButton *Button2;
TButton *Button3;
TButton *Button4;
TButton *Button5;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
void __fastcall Button3Click(TObject *Sender);
void __fastcall Button4Click(TObject *Sender);
void __fastcall Button5Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif