I'm trying to take a segment of C++ code and port it to perl to work into an existing script. The C code does nothing more than sends a message to a running program(Streets on a Disk) using WM_COPYDATA, and returns data from the same... Below is the Perl code I've tried, followed by the C code. I would appreciate ANY help on this, as I'm not very proficient in C(yet!) and have not yet grasped pack()/unpack() nor Win32::API. FWIW: I'm on Win2k Pro - AS 623
use Win32::GUI; use constant NULL=>0; use constant WM_COPYDATA => 74; my $myCommand="[EMAIL PROTECTED] text\n"; my $wparm = pack("I", NULL); my $dwData=pack("L",$myCommand); my $lpCopydatastruct=pack("pLp",$dwData,0,NULL); $st32H=Win32::GUI::FindWindow("StreetsOnADisk",""); ## this seems to give me "The handle is invalid" Win32::GUI::SendMessage($st32H,WM_COPYDATA,$lpCopydatastruct,0); I've also tried API: use Win32::API; use constant NULL=>0; use constant WM_COPYDATA => 74; my $myCommand='@CUSTOM_MENU_OK text'."\n"; my $wparm = pack("I", NULL); my $dwData=pack("L",$myCommand); my $lpCopydatastruct=pack("pLp",$dwData,0,NULL); my $FindWindowEx=new Win32::API('User32','FindWindowEx',[qw(N N P P)],'N'); ## this gives me "The specified procedure could not be found" my $SendMessage=new Win32::API("User32","SendMessage",[qw(N N N N)],'N'); my $hwnd=$FindWindowEx->Call($parent_hwnd,undef,'StreetsOnADisk',undef); my $lresult=$SendMessage->Call($st32H,WM_COPYDATA,$wparm,$lpCopydatastruct); And then the C++ code which works just fine for me: void CAPITestDlg::OnButton1() { CWnd *pWnd = CWnd::FindWindow("StreetsOnADisk", NULL); if (pWnd) { char commands[100]; strcpy(commands,"@CUSTOM_MENU_OK text\n"); COPYDATASTRUCT cds; cds.dwData = 0; //reserved for later use cds.cbData = strlen(commands)+1; /* enter the length of the command string in the buffer+1 */ cds.lpData = (void*) commands; /* point to command buffer */ Sleep(1000); LRESULT result = pWnd->SendMessage(WM_COPYDATA, (WPARAM)AfxGetApp()->m_pMainWnd->GetSafeHwnd(), (LPARAM)&cds); if(result==FALSE) AfxMessageBox("Streets is busy...",MB_OK | MB_ICONSTOP); } else /* on error: */ { AfxMessageBox("Streets On A Disk is not running...",MB_OK | MB_ICONSTOP); } } BOOL CAPITestDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pcds) { if(pcds->dwData == 0) { /* indicates an error processing the commands */ /* show error log: */ AfxMessageBox((char *) pcds->lpData,MB_OK | MB_ICONINFORMATION ); } else /* results were found without errors: */ { /* show results: */ AfxMessageBox((char *) pcds->lpData,MB_OK | MB_ICONINFORMATION ); } return CDialog::OnCopyData(pWnd, pcds); } <sig> Anthony George <[EMAIL PROTECTED]> Systems Engineer. Do your technical services need medical attention? We can help. EMSTS, LLC. 800-304-8269 231-720-1600 http://www.emsts.com </sig>