고수님들 window7에서 여러가지 문제가 발견되는데 어찌 처리해야할 지
도움 부탁드립니다,.
하나 해결하면 또 하나가 말썽입니다.
두 프로그램간에 메시지를 전달하는데 문자열에 문제가 발생합니다.
exe만들어서 build로 만들어진 exe파일을 구동하면 전혀 문제가 없는데
이 실행파일이 programs Files(X86)밑에 설치되면 문제가 발생합니다.
결론적으로 전달된 문자열이 반으로 잘려버립니다.
프로그램인 exe간에는 그래서 문자전달함수를 아래와 같이 고쳐서 보내니 문제가 없습니다.
윈도우버젼 읽은 함수
function TFuncCommon.GetOS;
var
OS :TOSVersionInfo;
begin
ZeroMemory(@OS,SizeOf(OS));
OS.dwOSVersionInfoSize:=SizeOf(OS);
GetVersionEx(OS);
Result:=osUnknown;
if OS.dwPlatformId=VER_PLATFORM_WIN32_NT then begin
case OS.dwMajorVersion of
3: Result:=osNT3;
4: Result:=osNT4;
5: Result:=os2K;
end;
if (OS.dwMajorVersion=5) and (OS.dwMinorVersion=1) then
Result:=osXP;
if (OS.dwMajorVersion=6) and (OS.dwMinorVersion=0) then
Result:=osVista;
if (OS.dwMajorVersion=6) and (OS.dwMinorVersion=1) then
Result:=osWin7;
end else begin
if (OS.dwMajorVersion=4) and (OS.dwMinorVersion=0) then begin
Result:=os95;
if (Trim(OS.szCSDVersion)='B') then
Result:=os95OSR2;
end else
if (OS.dwMajorVersion=4) and (OS.dwMinorVersion=10) then begin
Result:=os98;
if (Trim(OS.szCSDVersion)='A') then
Result:=os98SE;
end else
if (OS.dwMajorVersion=4) and (OS.dwMinorVersion=90) then
Result:=osME;
end;
end;
문자열을 보내는 함수
procedure TFuncCommon.SendMsg(AHandel: THandle; AMsg: string);
var
CDS: TCopyDataStruct;
S2 : pchar;
S1 :string;
begin
try
if AMsg = '' then
exit;
if AHandel = 0 then
exit;
FillChar(CDS,SizeOf(TCopyDataStruct),#0);
if GetOS = osWin7 then //window7의 경우
begin
S1 := AMsg + #0;
CDS.lpData := pChar(S1);
CDS.cbData := Length(S1)* 2;
end else
begin
S2 := PChar( AMsg );
CDS.lpData := S2;
CDS.cbData := Length( S2 ) + 1;
end;
SendMessageW(AHandel, WM_COPYDATA, 0, LongInt(@CDS));
except
//mmoLog.Lines.Add(Exception(ExceptObject).Message);
end;
end;
문자열을 받는 exe파일이고요
procedure TUploadMain.WMCopyData(var Msg: TWMCopyData);
var
Param : String;
Begin
Param := String(PChar(Msg.CopyDataStruct^.lpData));
FuncCommon.ExtractCommand(Param);
end;
위와 같이 하면 문제가 전혀 없는데
이 실행파일들을
programs Files(X86)\AAAA\안에 복사하고 실행하면
두 프로그램간에는 문제가 없는데
서버로부터 문자열을 전달받으면 그전과 똑같은 현상이 벌어집니다.
무슨 방법이 없을까요?
programs Files(X86) 아래에 있다고 바뀌는 건지...황당하네요.
고수님들의 도움 부탁드립니다.
참고로 서버에서 login체크하고 결과 보내주는 서버데몬코드입니다.
void *file_send_thread(void *client_sock_arg)
{
pthread_t tid;
MYSQL *mysql;
int client_sock;
int retval;
char info_buf[BUFSIZE];
memset(info_buf, 0x00, BUFSIZE);
tid =pthread_self();
client_sock =(int)client_sock_arg;
//*** DB Connection ***//
mysql = (MYSQL*)DBConnect();
if(!mysql) {
close(client_sock);
pthread_exit(NULL);
return;
}
else
sys_msg('S',"[Login] DB Connection");
retval = recvn(client_sock, info_buf, sizeof(LOGIN_DATA_INFO));
if ( strncmp( info_buf+1, "$_UP_LOGIN_DATA_$", 17 ) )
{
if ( strncmp( info_buf+1, "$_DOWN_LOGIN_DATA_$", 19 ) )
{
sys_msg('S',"[Loginload]====== The Wrong Packet! ========");
DBColse( mysql );
close(client_sock);
pthread_exit(NULL);
return;
}
}
//로그인 및 기타 정보 체크
login_process( mysql, info_buf );
retval = write(client_sock, info_buf, sizeof(LOGIN_DATA_RTN));
if(retval == -1)
sys_msg('E',"[Login] Socket Send Error!");
else
sys_msg('S',"[Login] Socket DATA Send");
sys_msg('C',"[Login] Clinet Socket Close!!");
DBColse( mysql );
close(client_sock);
pthread_exit(NULL);
}
질문중 하나가 Program Files폴더가 2개가 존재하는데 무슨 문제가 있는것 아니냐는 질문이었습니다.
답변인즉슨 하나는 64bit, 또 나머지 하나는 32bit용이라고 하더라고요...
위의 내용에 비추어보았을때 32bit, 64bit의 차이로 잘리고 안잘리고의 차이가 아닐런지 짐작해봅니다.