<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Helvetica;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:"Courier New";}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle20
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:28143321;
        mso-list-type:hybrid;
        mso-list-template-ids:1569230808 67698703 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l0:level1
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level2
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level3
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l0:level4
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level5
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level6
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l0:level7
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level8
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level9
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link="#0563C1" vlink="#954F72"><div class=WordSection1><pre><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>Hi Roger,<o:p></o:p></span></pre><pre><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p> </o:p></span></pre><pre><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>Sorry for not responding earlier, I guess I wasn’t subscribed to the list so I didn’t see your response in my email.  Had to find it manually via the archive list.  Following your advice, I tried:<o:p></o:p></span></pre><pre><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p> </o:p></span></pre><pre><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>To give some context, my goal is to create a C# wrapper around ome-files (or at least certain functionality in ome-files), so that I can read/write OME-TIFF files.  What I have done so far is:<o:p></o:p></span></pre><pre style='margin-left:.5in;text-indent:-.25in;mso-list:l0 level1 lfo2'><![if !supportLists]><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><span style='mso-list:Ignore'>1.<span style='font:7.0pt "Times New Roman"'>       </span></span></span><![endif]><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>Download <a href="https://www.openmicroscopy.org/ome-files/downloads/">OME Files 0.5.0</a> (Windows VC14 64-bit, self-contained super build) into a directory “C:\Users\...\Documents\Visual Studio 2015\Projects\OMEFilesSharp\External”.<o:p></o:p></span></pre><pre style='margin-left:.5in;text-indent:-.25in;mso-list:l0 level1 lfo2'><![if !supportLists]><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><span style='mso-list:Ignore'>2.<span style='font:7.0pt "Times New Roman"'>       </span></span></span><![endif]><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>Created a C++ DLL project in Visual Studio 2015 (hence the “OMEFiles.dll”) that effectively creates a wrapper around OMETIFFReader and OMETIFFWriter, and VariantPixelBuffer to get basic functionality working.  I followed the instructions <a href="https://www.openmicroscopy.org/community/viewtopic.php?f=13&t=8233&p=18005&hilit=ome+files+tutorial#p18005">here</a> for getting the project to build properly.<o:p></o:p></span></pre><pre style='margin-left:.5in;text-indent:-.25in;mso-list:l0 level1 lfo2'><![if !supportLists]><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><span style='mso-list:Ignore'>3.<span style='font:7.0pt "Times New Roman"'>       </span></span></span><![endif]><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>The reason that the C++ DLL is necessary is that I needed to make the API compatible with C types, so that I could use <a href="https://github.com/mono/CppSharp">CppSharp</a> to generate automatic C# bindings.<o:p></o:p></span></pre><pre><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p> </o:p></span></pre><pre><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>I tried to following your instructions, and did the following:<o:p></o:p></span></pre><pre><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p> </o:p></span></pre><pre style='margin-left:.5in;text-indent:-.25in;mso-list:l0 level1 lfo2'><![if !supportLists]><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><span style='mso-list:Ignore'>4.<span style='font:7.0pt "Times New Roman"'>       </span></span></span><![endif]><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>Adding ome::files::register_module_paths(); before I called setId(…).  This resulted in the same stack trace and exceptions that I relayed before.<o:p></o:p></span></pre><pre style='margin-left:.5in;text-indent:-.25in;mso-list:l0 level1 lfo2'><![if !supportLists]><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><span style='mso-list:Ignore'>5.<span style='font:7.0pt "Times New Roman"'>       </span></span></span><![endif]><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>I set the OME_FILES_HOME environment variable to the root directory (“C:\Users\...\Documents\Visual Studio 2015\Projects\OMEFilesSharp\External\ome-files”), and to the binary sub-directory (““C:\Users\...\Documents\Visual Studio 2015\Projects\OMEFilesSharp\External\ome-files\bin”), along with adding the ome::files::register_module_paths() call, but that resulted in the same stack trace and exceptions that I relayed before too.<o:p></o:p></span></pre><pre style='margin-left:.5in;text-indent:-.25in;mso-list:l0 level1 lfo2'><![if !supportLists]><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><span style='mso-list:Ignore'>6.<span style='font:7.0pt "Times New Roman"'>       </span></span></span><![endif]><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>I did a search for “<span style='color:black'>ome-model.xsl” and “</span>“<span style='color:black'>ome-model.xsd” and found neither in the downloaded super build.</span><o:p></o:p></span></pre><pre><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p> </o:p></span></pre><pre><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>To be honest, C++ is not my strong suit.  If there’s a better way to get set up in Windows, I’m all ears.<o:p></o:p></span></pre><pre><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p> </o:p></span></pre><pre><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>Thanks,<o:p></o:p></span></pre><pre><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>Dennis<o:p></o:p></span></pre><pre><o:p> </o:p></pre><pre>On 25/01/18 02:57, Dennis Ai wrote:<o:p></o:p></pre><pre>><i> Upon some further investigation, it looks like I pasted the wrong stack<o:p></o:p></i></pre><pre>><i> trace and exception.  This is the correct one.<o:p></o:p></i></pre><pre><o:p> </o:p></pre><pre>Dear Dennis,<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>I think your open method is fine, and the path is fine.  You should be<o:p></o:p></pre><pre>able to pass a const char * or const std::string& directly to the setId<o:p></o:p></pre><pre>method, by the way.  It will be implicitly converted to a<o:p></o:p></pre><pre>filesystem::path.  (This will eventually become std::filesystem::path<o:p></o:p></pre><pre>once we add support for C++17.).  Using either "\\" or "/" as a path<o:p></o:p></pre><pre>separator should work equally well.<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>If you catch and log the exception's what() output it should tell you<o:p></o:p></pre><pre>exactly what failed.  I suspect it's throwing here:<o:p></o:p></pre><pre><o:p> </o:p></pre><pre> >        OMEFiles.dll!ome::common::module_runtime_path(class<o:p></o:p></pre><pre> > std::basic_string<char,struct std::char_traits<char>,class<o:p></o:p></pre><pre> > std::allocator<char> > const &)       Unknown<o:p></o:p></pre><pre><o:p> </o:p></pre><pre><a href="https://github.com/ome/ome-common-cpp/blob/master/lib/ome/common/module.cpp#L486">https://github.com/ome/ome-common-cpp/blob/master/lib/ome/common/module.cpp#L486</a><o:p></o:p></pre><pre><o:p> </o:p></pre><pre>Given the stacktrace, I think it's trying to load the OME-XML schema or<o:p></o:p></pre><pre>transforms, and failing to find them.  The what() output will tell you<o:p></o:p></pre><pre>which it is.<o:p></o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre>There are a few potential causes here, which I'll try to outline.<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>1) The module-specific paths are registered here during static<o:p></o:p></pre><pre>initialisation.  When building a shared library on Unix, this happens<o:p></o:p></pre><pre>automatically.  When building a static library the initialisation<o:p></o:p></pre><pre>functions can be elided by the linker; there are methods in each<o:p></o:p></pre><pre>component such as ome::files::register_module_paths() which will trigger<o:p></o:p></pre><pre>the registration by hand [and also prevents the elision as a<o:p></o:p></pre><pre>side-effect].  Note that static initialisation hasn't been well tested<o:p></o:p></pre><pre>on Windows, because we don't yet support building of DLLs, and there may<o:p></o:p></pre><pre>be improvements to be made in that code.<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>- you could try adding an explicit call to<o:p></o:p></pre><pre>ome::files::register_module_paths() before calling .setId or any other<o:p></o:p></pre><pre>ome-files functions.<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>2) The installation root might not be detected properly.  If you've<o:p></o:p></pre><pre>configured and installed into a defined prefix (CMAKE_INSTALL_PREFIX),<o:p></o:p></pre><pre>that will be the default place to search.  Otherwise, it can introspect<o:p></o:p></pre><pre>the DLL to find out where it's located.  See<o:p></o:p></pre><pre><a href="https://github.com/ome/ome-common-cpp/blob/master/lib/ome/common/module.h#L250">https://github.com/ome/ome-common-cpp/blob/master/lib/ome/common/module.h#L250</a><o:p></o:p></pre><pre>and module_path().  These can all be overridden with the OME_FILES_HOME<o:p></o:p></pre><pre>environment variable, or other more specific variables which are<o:p></o:p></pre><pre>detailed here:<o:p></o:p></pre><pre><a href="http://docs.openmicroscopy.org/ome-files-cpp/0.5.0/ome-files/manual/html/ome-files-env.html#environment">http://docs.openmicroscopy.org/ome-files-cpp/0.5.0/ome-files/manual/html/ome-files-env.html#environment</a><o:p></o:p></pre><pre>  As for (1) I would note that because we don't currently support<o:p></o:p></pre><pre>building DLLs, the GetModuleHandleExW/GetModuleFileNameW logic might<o:p></o:p></pre><pre>need some improvement, since it's not been used or supported in<o:p></o:p></pre><pre>practice.  You shouldn't need to use those environment variables for<o:p></o:p></pre><pre>production use, but they might be useful for diagnosing what's wrong.<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>- Try using OME_FILES_HOME / OME_XML_SCHEMADIR / OME_XML_TRANSFORMDIR to<o:p></o:p></pre><pre>explicitly tell it where the datafiles are and bypass the path autodetection<o:p></o:p></pre><pre>- If you add some logging to the steps in module_runtime_path() it<o:p></o:p></pre><pre>should show which part(s) are failing and what it thinks the data<o:p></o:p></pre><pre>directory paths are (which could potentially be wrong)<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>3) If all of the above are working, it might be that the directory it's<o:p></o:p></pre><pre>looking for doesn't exist, so it can't load the needed datafiles.  Does<o:p></o:p></pre><pre>your application have the ome-model XSD and XSL files present in the<o:p></o:p></pre><pre>installation directory?<o:p></o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre>Finally, I was very interested to see "OMEFiles.dll" in your stacktrace.<o:p></o:p></pre><pre>  I would be very interested to know how that was created, and if you<o:p></o:p></pre><pre>used our standard CMake builds in each component, or your did your own<o:p></o:p></pre><pre>thing.  We would very much like to support and provide DLLs for the<o:p></o:p></pre><pre>various components on Windows for ome-common, ome-model and ome-files<o:p></o:p></pre><pre>etc., but I was under the impression that some of the STL templated<o:p></o:p></pre><pre>containers and other template usage precluded passing them across DLL<o:p></o:p></pre><pre>boundaries, several of which are used in our public interfaces.<o:p></o:p></pre><pre>However, I'm not a DLL expert.  If there's anything we can do to support<o:p></o:p></pre><pre>building of DLLs, then we would be very welcoming of any suggestions you<o:p></o:p></pre><pre>have for doing so.  This is why our builds of OME-Files currently only<o:p></o:p></pre><pre>provide static libraries on Windows, but I would love to remove this<o:p></o:p></pre><pre>limitation.<o:p></o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre>Kind regards,<o:p></o:p></pre><pre>Roger Leigh<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>--<o:p></o:p></pre><pre>Dr Roger Leigh -- Open Microscopy Environment<o:p></o:p></pre><pre>Wellcome Trust Centre for Gene Regulation and Expression,<o:p></o:p></pre><pre>College of Life Sciences, University of Dundee, Dow Street,<o:p></o:p></pre><pre>Dundee DD1 5EH Scotland UK   Tel: (01382) 386364<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>The University of Dundee is a registered Scottish Charity, No: SC015096<o:p></o:p></pre><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><b>Dennis Ai</b><o:p></o:p></p><p class=MsoNormal><span style='font-size:9.0pt'>Senior Strategic Advisor, SRI Biosciences</span><o:p></o:p></p><p class=MsoNormal><span style='font-size:9.0pt'>SRI International</span><o:p></o:p></p><p class=MsoNormal><span style='font-size:9.0pt'>333 Ravenswood Ave</span><o:p></o:p></p><p class=MsoNormal><span style='font-size:9.0pt'>Menlo Park, CA 94025</span><o:p></o:p></p><p class=MsoNormal><span style='font-size:9.0pt'>(847) 440-4765</span><o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal><b><span style='font-size:14.0pt;font-family:"Helvetica",sans-serif'>SRI </span></b><span style='font-size:14.0pt;font-family:"Helvetica",sans-serif'>Biosciences</span><sup><span style='font-size:10.0pt;font-family:"Helvetica",sans-serif'>™</span></sup><o:p></o:p></p><p class=MsoNormal><span style='font-size:6.0pt;font-family:"Helvetica",sans-serif'>A DIVISION OF SRI INTERNATIONAL</span><o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>