How to connect to windows phone 7 from a 64-bit application

前端 未结 1 727
抹茶落季
抹茶落季 2021-01-28 05:48

I have a 32-bit program (written in C++) that can connect to some different devices and as long as it is 32-bit everything works fine. However, now I need to build it as a 64-bi

1条回答
  •  有刺的猬
    2021-01-28 05:55

    The COM server with CLSID = {349AB2E8-71B6-4069-AD9C-1170849DA64C} is implemented in C:\Program Files (x86)\Common Files\Microsoft Shared\Phone Tools\CoreCon\11.0\Bin\ConMan2.dll There’s no 64-bit version of that DLL. And you can’t use a 32-bit DLLs directly from a 64 bit process.

    There’s a workaround. You can create another project, 32-bit EXE, that will call that 32-bit DLL however you want, and implement any IPC to interact with your main 64-bit application. For the specific IPC mechanism, if you only need to invoke a single relatively long task and wait for it to complete, command-like app + command-line arguments + exit code may me enough for you.

    If you need to issue many calls, I’d choose WCF over named pipe transport. If you’ll choose this way, below is some sample code implementing that .EXE.

    /// The class from the shared assembly that defines WCF endpoint, and named events
    public static class InteropShared
    {
        // Host signals it's ready and listening. Replace the zero GUID with a new one
        public static readonly EventWaitHandle eventHostReady = new EventWaitHandle( false, EventResetMode.AutoReset, @"{00000000-0000-0000-0000-000000000000}" );
    
        // Client asks the host to quit. Replace the zero GUID with a new one
        public static readonly EventWaitHandle eventHostShouldStop = new EventWaitHandle( false, EventResetMode.AutoReset, @"{00000000-0000-0000-0000-000000000000}" );
    
        const string pipeBaseAddress = @"net.pipe://localhost";
    
        /// Pipe name
        // Replace the zero GUID with a new one.
        public const string pipeName = @"00000000-0000-0000-0000-000000000000";
    
        /// Base addresses for the hosted service.
        public static Uri baseAddress { get { return new Uri( pipeBaseAddress ); } }
    
        /// Complete address of the named pipe endpoint.
        public static Uri endpointAddress { get { return new Uri( pipeBaseAddress + '/' + pipeName ); } }
    }
    
    static class Program
    {
        /// The main entry point for the application.
        [STAThread]
        static void Main()
        {
            // The class implementing iYourService interface that calls that 32-bit DLL
            YourService singletoneInstance = new YourService();
    
            using( ServiceHost host = new ServiceHost( singletoneInstance, InteropShared.baseAddress ) )
            {
                // iYourService = [ServiceContract]-marked interface from the shared assembly
                host.AddServiceEndpoint( typeof( iYourService ), new NetNamedPipeBinding(), InteropShared.pipeName );
                host.Open();
    
                InteropShared.eventHostReady.Set();
    
                // Wait for quit request
                InteropShared.eventHostShouldStop.WaitOne();
    
                host.Close();
            }
        }
    }
    

    0 讨论(0)
提交回复
热议问题